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; }
}