7

我正在使用一个类的简写版本,如下所示:

using NodeSteps = Tuple<Node, int>;

Node是我自己定义的一个类。这通常工作得很好,但这里的问题是,Node 是一个需要结构的泛型。

我的问题如下:

1.这些typedef在C#中是如何调用的。我知道它们不完全是 typedef,但这是我能想到的最相似的东西。

2.如何制作通用版?

using NodeSteps<T> = Tuple<Node<T>, int>;

我注意到这不是这样做的方法。我还想指定 T 是一个结构。

4

5 回答 5

9

利用

class NodeSteps<T> : Tuple<Node<T>, int>
{
}

这与我所知道的 typedef 最接近。但是,如果有任何非默认构造函数,则需要声明它们。

于 2013-11-05T13:53:07.473 回答
7
  1. 它们被称为别名。

  2. 不,这是不可能的。C# 语言规范:

使用别名可以命名一个封闭的构造类型,但不能在不提供类型参数的情况下命名一个未绑定的泛型类型声明。

因此,using x<T> = List<T>或类似的事情是不可能的。

您可以改用一个类(请参阅其他答案)。

于 2013-11-05T13:53:50.503 回答
6

C# 语言规范的第 9.4.1 节对此进行了介绍。

使用别名可以命名一个封闭的构造类型,但不能在不提供类型参数的情况下命名一个未绑定的泛型类型声明。

这称为别名,不能泛型,但使用的右手可以泛型

using ListOfInts = List<int>

已验证

于 2013-11-05T13:54:18.763 回答
3
using NodeSteps = Tuple<Node, int>;

不等同于 atypdef而只是该类的别名。它旨在解决命名空间冲突,而不必使用整个命名空间。我要做的是定义一个新类:

public class NodeSteps<T> : Tuple<Node<T>, int> where t: struct
{
}
于 2013-11-05T13:54:09.350 回答
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();
         }
    }
}
于 2013-11-05T14:12:35.970 回答