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++中需要的额外的范围消歧。