gpt4 book ai didi

c# - 内部类泛型类型与外部类型相同

转载 作者:行者123 更新时间:2023-11-30 23:22:34 29 4
gpt4 key购买 nike

我发现了一个问题 here几乎回答了我的问题,但我仍然没有完全理解。

尝试编写树数据结构,我这样做了:

public class Tree<T>
{
public TreeNode<T> root;
...

public class TreeNode<T>
{
List<TreeNode<T>> children;
T data;
public T Data { get { return data; } }

public TreeNode<T>(T data)
{
this.data = data;
children = new List<TreeNode<T>>();
}
...
}
}

而且,任何使用过 C# 泛型的人显然都知道我收到了这个编译器警告:Type parameter 'T' has the same name as the type parameter from outer type 'Tree<T>'

我的意图是创建一个内部类,它会被迫使用与外部类相同的类型,但我现在明白了,添加一个类型参数实际上可以让内部类更加灵活。但是,就我而言,我想要 Tree<T> 的子类能够使用 TreeNode ,例如,像这样:

public class IntTree : Tree<int>
{
...
private static IntTree fromNode(TreeNode<int> node)
{
IntTree t = new IntTree();
t.root = node;
return t;
}
}

(该方法允许子类递归实现ToString())

所以我的问题是,如果我去掉参数化,像这样:

public class Tree<T>
{
public TreeNode root;
...

public class TreeNode
{
List<TreeNode> children;
T data;
public T Data { get { return data; } }

public TreeNode(T data)
{
this.data = data;
children = new List<TreeNode>();
}
...
}
}

在创建 TreeNode 时,生成的子类是否会被强制使用整数? s,因此永远无法打破我的意图?

免责声明:是的,我知道我在这里可能做错了很多事情。我仍在学习 C#,主要来自 Java 和 Lisp 背景,还有一点纯 C。因此欢迎提出建议和解释。

最佳答案

是的,它会被强制使用相同的类型。再看声明:

public class Tree<T>
{
public class TreeNode
{
private T Data;
}
}

所以 Data 的类型当您实例化一个特定的 Tree 时确定:

var tree = new Tree<int>();

这样Data的类型声明为 int并且没有什么不同。

请注意,没有非通用的 TreeNode类(class)。只有一个 Tree<int>.TreeNode输入:

Tree<int> intTree = new Tree<int>(); // add some nodes
Tree<int>.TreeNode intNode = intTree.Nodes[0]; // for example

Tree<string> stringTree = new Tree<int>(); // add some nodes
Tree<string>.TreeNode stringNode = stringTree.Nodes[0]; // for example

// ERROR: this won't compile as the types are incompatible
Tree<string>.TreeNode stringNode2 = intTree.Nodes[0];

A Tree<string>.TreeNode是与 Tree<int>.TreeNode 不同的 类型.

关于c# - 内部类泛型类型与外部类型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38722514/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com