c# - 为什么不允许在 .NET 中就地实现接口(interface)?

标签 c# .net interface anonymous in-place

要么是我遗漏了什么,要么是 .NET 不支持 Java 的功能。我希望能够避免为了实现一个小接口(interface)而创建一个小类。例如,LINQ 的 Except 方法需要 IEqualityComparer。所以我不得不写一个实现接口(interface)的小类。但是在 Java 中,我可以简单地做一个 new IEqualityComparer() {//interface declarations } 并完成它。所以有什么问题?

这与这篇文章有些相关:

Can a C# anonymous class implement an interface? .

补充: 目前,我为 EqualsGetHashCode 添加了覆盖。

最佳答案

你是对的,与 Java 不同,C# 不支持可以实现接口(interface)的匿名内部类的概念。我遇到了与 IEqualityComparer 完全相同的问题。并最终得出以下解决方案。

public static class Utils {
  private sealed class EqualityComparer<T> : IEqualityComparer<T> {
    private readonly Func<T, T, bool> m_equals;
    private readonly Func<T, int> m_getHashCode;
    internal EqualityComparer(
      Func<T, T, bool> equals,
      Func<T, int> getHashCode) {
      m_equals = equals;
      m_getHashCode = getHashCode;
    }
    public bool Equals(T left, T right) {
      return m_equals(left, right);
    }
    public int GetHashCode(T value) {
      return m_getHasheCode(value);
    }
  }

  public static IEqualityComparer<T> CreateEqualityComparer<T>(
    Func<T, T, bool> equals, 
    Func<T, int> getHashCode) {
    return new EqualityComparer<T>(equals, getHashCode);
  }
}

现在在我想要动态的地方IEqualityComparer<T>我可以做以下事情

var comparer = Utils.CreateEqualityComparer<Student>(
  (left, right) => left.Name == right.Name,
  value => value.Name.GetHashCode());

关于c# - 为什么不允许在 .NET 中就地实现接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5877017/

相关文章:

c# - 从 c# winforms 应用程序将输出写入控制台

c# - CSV 正则表达式拆分缺失的列

c# - 为什么不引发 "Divide by Zero"或任何其他异常?

java - 在程序中应用接口(interface)和抽象类的概念

c# - 在C#中实现接口(interface)时如何传递子类参数?

c# - 套接字仅捕获传出数据包,而不捕获传入数据包

c# - 使用 Cloo(OpenCL 的 C# 包装器)和 Intel SDK 的 OpenCL 内核中断点不起作用

c# - 在托管环境中计划执行 .NET 代码?

java - SearchableByName 接口(interface)不断返回 null

c# - 如何使点对点确认通信 C#