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

时间:2013-06-17 19:09:42

标签: 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> left, right;
        ...
    }
}

它工作正常,但我收到编译器警告:Type parameter 'T' has the same name as the type parameter from outer type 'Tree<T>'嗯,当然它的名称相同,它们应该是相同的类型。 (事实上​​,由于Node类是私有的,因此永远不能在Tree类之外访问,因此它们保证是相同的类型。这是编译器警告只是BS,我可以放心地忽略?或者是否有一些很好的理由为什么我应该给内部类一个不同的通用名称(除了让警告消失之外)?

(我看到this question,这是警告本身,但这显然是一种不同的情况。类型保证是相同的,因为Node仅创建并且在Tree的范围内访问,因此没有混淆的可能性。)

2 个答案:

答案 0 :(得分:10)

您误解了嵌套类型参数。

编译器警告您有关Tree<int>.Node<string>等构造类型的信息。这些类型会让你的生活悲惨。 (我说的是个人经历)

如果您想使用T中的外Node,则不应将Node设为通用。

通常,将一个泛型类型嵌套在不同类型中的原因很少。

答案 1 :(得分:3)

你想要的可能是:

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

    ...

    private class Node: IEnumerable<T>
    {
        private Node left, right;
        ...
    }
}

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