我正在使用类的速记版本,如下所示:
using NodeSteps = Tuple<Node, int>;
Node是我自己定义的类。这通常很好,但问题是,Node是一个需要结构的泛型。
我的问题如下:
1。 如何在C#中调用这些typedef。我知道它们并不完全是typedef,但它是我能想到的最相似的东西。
2。 我怎样才能制作通用版本?
using NodeSteps<T> = Tuple<Node<T>, int>;
我注意到这不是这样做的方法。我还想指定T是一个结构。
答案 0 :(得分:7)
使用
class NodeSteps<T> : Tuple<Node<T>, int>
{
}
这是我所知道的typedef最接近的等价物。如果有任何非默认构造函数,则需要声明它们。
答案 1 :(得分:7)
它们被称为别名。
不,这是不可能的。 C#语言规范:
使用别名可以命名一个封闭的构造类型,但不能在不提供类型参数的情况下命名未绑定的泛型类型声明。
因此,using x<T> = List<T>
或类似的东西是不可能的。
您可以使用课程(请参阅其他答案)。
答案 2 :(得分:5)
这将在C#语言规范的第9.4.1节中介绍。
使用别名可以命名一个封闭的构造类型,但不能命名 未提供类型参数的未绑定泛型类型声明。
这称为别名,不能是通用的,但使用的右手可以是通用的
using ListOfInts = List<int>
有效
答案 3 :(得分:3)
using NodeSteps = Tuple<Node, int>;
不等同于typdef
,而只是该类的别名。它旨在解决命名空间冲突,而无需使用整个命名空间。我要做的是定义一个新类:
public class NodeSteps<T> : Tuple<Node<T>, int> where t: struct
{
}
答案 4 :(得分:0)
这有效:
namespace Test1
{
class Node<T>
{
public T Test()
{
return default(T);
}
}
}
namespace Test1
{
using NodeSteps = System.Tuple<Node<string>, int>;
public class Class1
{
public static void Main()
{
NodeSteps t1 = new NodeSteps(new Node<string>(), 10);
t1.Item1.Test();
}
}
}