6

所以我有一个树类:

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,我可以放心地忽略吗?或者有什么好的理由我应该给内部类一个不同的通用名称(不仅仅是让警告消失)?

(我看到了这个问题,这是关于警告本身的,但这显然是一个不同的场景。类型保证是相同的,因为Node's 只在 的上下文中创建和访问Tree,所以没有混淆的机会。 )

4

2 回答 2

10

您误解了嵌套类型参数。

编译器会警告您有关构造类型的信息,例如Tree<int>.Node<string>. 这样的类型会让你的生活变得悲惨。(我根据个人经验说)

如果你想使用外部Tin Node,你不应该Node通用。

一般来说,很少有理由将一种泛型类型嵌套在不同的泛型类型中。

于 2013-06-17T19:11:56.517 回答
4

你想要的可能是:

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

    ...

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

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

于 2013-06-17T19:43:41.377 回答