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>;

は a と同等ではなく、そのクラスtypdefの単なるエイリアスです。名前空間全体を使用することなく、名前空間の競合を回避するように設計されています。私がすることは、新しいクラスを定義することです:

public class NodeSteps<T> : Tuple<Node<T>, int> where t: struct
{
}
于 2013-11-05T13:54:09.350 に答える