0

可能重复:
不能将运算符 == 应用于 C# 中的泛型类型吗?

我有一个“GenericNode”-父/子结构,我正在尝试为其创建一个 Find 方法。

public class GenericNode<TKey, TName>
{
  private GenericNode<TKey, TName> parent;
  private readonly TKey key;
  private readonly TName name;
  private readonly ICollection<GenericNode<TKey, TName>> children;

  public GenericNode(TKey key, TName name) {
    this.key = key;
    this.name = name;
    children = new Collection<GenericNode<TKey, TName>>();
  }

  // AddChild etc...

  public GenericNode<TKey, TName> GetChildNodeById(TKey keyToFind)
  {
    return FindChild(node => node.key == keyToFind); // <--- THIS WON'T COMPILE
  }

  private GenericNode<TKey, TName> FindChild(Func<GenericNode<TKey, TName>, Boolean> matcher)
  {
    // Recursive search returning first matching node...
  }
}

上面的(C# .NET 3.5)不起作用,因为它无法node.key与-methodkeyToFind进行比较。GetChildNodeById我一直在尝试不同的通用约束等,但没有运气。如何指定 TKey:s 是同一类型?

我可以创建一个带有 Guid 作为键的派生类,并将 GetChildNodeById 移动到该类,但如果可能的话,我想要一个通用的解决方案。有什么想法吗?

4

1 回答 1

0

有很多方法可以实现这一点:

  1. 做一个约束,这样TKey : IComprabaleGetNodeByKey就可以调用Compare键了。

  2. 做一个约束TKey : IEquatable<TKey>,这样你就可以调用Equals这个键了。

  3. 不使用相等运算符,而是调用Equals键。请注意,您NullReferenceException这样做是有风险的,并且为了检查 key 是否为 null 您需要添加一个 constraint TKey : class

  4. 呼叫Object.Equals钥匙。请注意,如果您的键是值类型,这会影响性能,因为在调用Object.Equals它们时会被装箱。

  5. 让树类的用户提供他的比较器。我建议采用标准 .NET 集合的模式。例如看看Dictionary可以带比较器的不同构造函数。

于 2012-12-08T08:54:30.080 回答