C# 这可能吗?(为子接口中的IEquatable提供默认实现)
我试图创建一个具有C# 这可能吗?(为子接口中的IEquatable提供默认实现),c#,.net,c#-8.0,C#,.net,C# 8.0,我试图创建一个具有Id属性的接口,然后使用该Id实现IEquatable 但是,实现中间接口的类抛出了一个错误,即它没有实现IEquatable 我猜这种类型的功能根本不存在,但我很难描述这种功能到底是什么,也很难为我想做的事情找到解决办法 我想做的是允许类简单地实现IntermediateInterface,并通过该接口所需的Id属性立即彼此相等 以下是作为文本的代码: 公共接口中间接口:IEquatable 其中T:中间接口 { int Id{get;set;} 公共新bool等于(T其他)
Id
属性的接口,然后使用该Id实现IEquatable
但是,实现中间接口的类抛出了一个错误,即它没有实现IEquatable
我猜这种类型的功能根本不存在,但我很难描述这种功能到底是什么,也很难为我想做的事情找到解决办法
我想做的是允许类简单地实现IntermediateInterface
,并通过该接口所需的Id
属性立即彼此相等
以下是作为文本的代码:
公共接口中间接口:IEquatable
其中T:中间接口
{
int Id{get;set;}
公共新bool等于(T其他)
{
返回Id.Equals(其他Id);
}
}
公共类的实际类型:IntermediateInterface所以我想出来了
如果我显式地(使用IEquatable标识符)使用IntermediateInterface override Equals,它将按照我预期的方式工作
截图:
编辑:
下面是一些正确的代码(作为文本!):
公共接口中间接口:IEquatable
其中T:中间接口
{
int Id{get;set;}
布尔等式等于(T其他)
{
返回Id==其他?.Id;
}
}
公共类实际类型:中间接口{
公共int Id{get;set;}
}
为什么要将其设置为新的
?因为它是由Visual Studio建议的Studio@madreflection:我也被你的评论弄糊涂了;接口方法的默认实现是Java中Mixin的一种常见技术,这是Java中为数不多的C#中缺少的特性之一。在一种已经存在扩展方法的语言中,我有点怀疑默认接口样式混合的价值,但我不确定您的评论是什么意思。你能澄清一下吗?@EricLippert:我很想听听你的看法。潜在的博客帖子?@madreflection:好主意!我在写博客方面落后了,但我会把它添加到可能的主题队列中。我喜欢在学习过程中必须学习的主题。:)看起来它正在调用Equals(object)
。如果T
是一个值类型,它将框选other
,如果它是一个引用类型,它仍将进行引用比较。以这种方式实现IEquatable
对您没有任何帮助。@因此,对于值类型,我应该使用=
而不是.Equals
?不,您应该用自己的逻辑实现接口的Equals(t)
,而不仅仅是将它委托给Equals(object)
。
public interface IntermediateInterface<T> : IEquatable<T>
where T : IntermediateInterface<T>
{
int Id { get; set; }
public new bool Equals(T other)
{
return Id.Equals(other.Id);
}
}
public class ActualType : IntermediateInterface<ActualType> {
public int Id { get; set; }
}
public interface IntermediateInterface<T> : IEquatable<T>
where T : IntermediateInterface<T>
{
int Id { get; set; }
bool IEquatable<T>.Equals(T other)
{
return Id == other?.Id;
}
}
public class ActualType : IntermediateInterface<ActualType> {
public int Id { get; set; }
}