简单地说,我正在学习C# 7.0中的一个教程,并得到了一个我无法修复的错误。我理解错误的方式是,这个方法需要是一个抽象的方法,我也尝试过,但是这并没有解决错误。我认为抽象类允许使用非抽象方法。
以下是代码:
public abstract class EqualityComparer<T>: IEqualityComparer, IEqualityComparer<T>
{
public abstract bool Equals(T x, T y);
public abstract int GetHashCode(T obj);
bool IEqualityComparer.Equals(object x, object y);
int IEqualityComparer.GetHashCode(object obj);
public static EqualityComparer<T> Default { get; }
}以下是错误:
'EqualityComparer<T>.IEqualityComparer.Equals(object, object)' must declare a body because it is not marked abstract, extern, or partial请告诉我我做错了什么。
发布于 2018-08-10 19:12:08
您必须实现这些方法(显式接口实现使方法高效地成为private,从而防止它们成为abstract:您不能声明,比方说,abstract bool IEqualityComparer.Equals... ),例如:
bool IEqualityComparer.Equals(object x, object y) {
if (x is T && y is T)
return this.Equals((T)x, (T)y); // known types, run Equals
else
return object.Equals(x, y); // unknown type(s), run default Equals
}
int IEqualityComparer.GetHashCode(object obj) {
if (obj is T)
return this.GetHashCode((T)obj);
else
return null == obj ? 0 : obj.GetHashCode();
}发布于 2018-08-10 19:00:33
abstract类可以具有abstract方法/属性和non-abstract方法/属性。abstract类的子类必须实现基类中标记为abstract的所有方法/属性。
abstract方法/属性不需要在基类中实现。但是,基类中没有标记abstract的任何方法/属性都必须实现(即有代码)。
记住,子类不需要实现未标记为abstract的方法/属性;有人需要实现它们。
您所得到的错误是第二个Equals重载--这个重载:
bool IEqualityComparer.Equals(object x, object y);你还需要提供一个机构,以便:
int IEqualityComparer.GetHashCode(object obj);请注意,它不是abstract,也没有实现/主体。它需要看起来像:
int IEqualityComparer.GetHashCode(object obj)
{
//your code goes here - returning an int
}https://stackoverflow.com/questions/51792567
复制相似问题