C# 内部泛型类型与外部泛型类型相同-编译器警告

C# 内部泛型类型与外部泛型类型相同-编译器警告,c#,generics,warnings,inner-classes,C#,Generics,Warnings,Inner Classes,所以我有一个树类: public class Tree<T> : IEnumerable where T : IComparable<T> { private Node<T> root = null; ... private class Node<T> : IEnumerable<T> where T : IComparable<T> { private Node<T

所以我有一个树类:

public class Tree<T> : IEnumerable where T : IComparable<T>
{
    private Node<T> root = null;

    ...

    private class Node<T> : IEnumerable<T> where T : IComparable<T>
    {
        private Node<T> left, right;
        ...
    }
}
公共类树:IEnumerable其中T:IComparable
{
私有节点根=null;
...
私有类节点:IEnumerable,其中T:IComparable
{
私有节点左、右;
...
}
}
它工作正常,但我得到了编译器警告:
类型参数“T”与外部类型“Tree”中的类型参数具有相同的名称。
当然是相同的名称,它们应该是相同的类型。(事实上,由于
节点
类是私有的,因此永远不能在
类之外访问,因此它们保证是相同的类型。这个编译器警告是我可以安全忽略的吗?或者我有什么理由给内部类一个不同的泛型名称(除了让警告消失之外)


(我看到了,这是关于警告本身的,但这显然是一个不同的场景。类型保证是相同的,因为
节点
只在
树的上下文中创建和访问,所以不可能混淆。)

您误解了嵌套的类型参数

编译器正在警告您有关构建的类型,如
Tree.Node
。此类类型将使您的生活痛苦。(我是根据个人经验说的)

如果要在
节点中使用外部
T
,则不应将
节点设置为通用


一般来说,很少有理由将一个泛型类型嵌套到另一个泛型类型中。

您想要的可能是:

public class Tree<T> : IEnumerable where T : IComparable<T>
{
    private Node root = null;

    ...

    private class Node: IEnumerable<T>
    {
        private Node left, right;
        ...
    }
}
公共类树:IEnumerable其中T:IComparable
{
私有节点根=null;
...
私有类节点:IEnumerable
{
私有节点左、右;
...
}
}

如果希望内部类具有相同的T,则无需重新定义它。

由于
Node
是私有的,因此不可能构造这样的类型。(好吧,我想
Tree
可以在内部构造一个,但它没有,所以不用担心。)@DarrelHoffman为什么没有被省略的
构造一个
节点
?@hvd是的,我的意思是它可以构造一个不同类型的
节点
,但它没有。它只会创建
节点
。如果我做一些像
树.节点
这样疯狂的事情,我会期望出现错误或至少是警告,但那是永远不会发生。@DarrelHoffman:但它可能会发生,编译器会警告你它可能会发生。(可以说,在为时已晚之前)是的,我在SLaks的回答后基本上理解了这个。当我在C++中这样做的时候,节点类都必须引用它,但是这是因为C++中需要的额外的范围消歧。