【问题标题】:C#: Is this possible? (Providing default implementation for IEquatable in sub-interface)C#:这可能吗? (在子接口中为 IEquatable 提供默认实现)
【发布时间】:2020-02-19 17:44:49
【问题描述】:

我正在尝试创建一个具有 Id 属性的接口,然后使用该 ID 实现 IEquatable。

但是,实现中间接口的类会抛出一个错误,它没有实现IEquatable。

我猜这种类型的功能根本不存在,但我正在努力描述这种功能的确切含义 并为我想做的事情找到任何解决方法。

我想要做的是允许类简单地实现IntermediateInterface,并通过该接口所需的Id 属性立即相互平等。

下面是文本代码:

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

这是错误文本: Error CS0535 'ActualType' does not implement interface member 'IEquatable<ActualType>.Equals(ActualType)'

这是来自视觉工作室的截图:

【问题讨论】:

  • 你为什么要做new?
  • 因为是Visual Studio建议的
  • @madreflection:我也对你的评论感到困惑;接口方法的默认实现是 Java 中 mixins 的常用技术,它是 Java 中为数不多的 C# 中缺少的特性之一。我对默认接口样式混合在已经存在扩展方法的语言中的价值持怀疑态度,但我不确定您的评论是什么意思。你能澄清一下吗?
  • @EricLippert:我希望喜欢让你接受它。潜在的博文?
  • @madreflection:好主意!我的博客落后了,但我会将其添加到可能的主题队列中。我喜欢我必须在此过程中学习一些东西的主题。 :)

标签: c# .net c#-8.0


【解决方案1】:

所以我想通了。

如果我有 IntermediateInterface 显式覆盖 Equals(使用 IEquatable 标识符),它会按我的预期工作。

截图:

编辑:

这是一些正确的代码(作为文本!):

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

【讨论】:

  • 看起来它正在调用Equals(object)。如果T 是值类型,它会装箱other,如果它是引用类型,它仍然会进行引用比较。以这种方式实施IEquatable&lt;T&gt; 最终不会为您做任何您还没有的事情。
  • @madreflection 所以对于值类型我应该使用== 而不是.Equals?
  • 不行,你应该用你自己的逻辑实现接口的Equals(T),而不是仅仅委托给Equals(object)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2023-03-15
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多