web-dev-qa-db-ja.com

ジェネリック型で「using alias = class」を使用していますか?

したがって、次の例のように、名前空間全体ではなく、名前空間からクラスを1つだけ含めたい場合があります。usingステートメントでそのクラスのエイリアスを作成します。

using System;
using System.Text;
using Array = System.Collections.ArrayList;

引数を繰り返す必要がないように、私はしばしばジェネリックでこれを行います:

using LookupDictionary = System.Collections.Generic.Dictionary<string, int>;

今、私はジェネリック型として同じことを達成したいのですが、ジェネリック型として保存します:

using List<T> = System.Collections.Generic.List<T>;

しかし、それはコンパイルされないので、型をジェネリックのままにしてこのエイリアスを作成する方法はありますか?

88
csharptest.net

いいえ、ありません。 C#の型エイリアスは閉じた(完全に解決された)型でなければならないため、開いているジェネリックはサポートされていません

これは、C#言語仕様のセクション9.4.1で説明されています。

エイリアスを使用すると、閉じた構築型に名前を付けることができますが、非バインドジェネリック型に名前を付けることはできません型引数を指定せずに宣言できます。

namespace N2
{
    using W = N1.A;         // Error, cannot name unbound generic type
    using X = N1.A.B;       // Error, cannot name unbound generic type
    using Y = N1.A<int>;    // Ok, can name closed constructed type
    using Z<T> = N1.A<T>;   // Error, using alias cannot have type parameters
}
89
JaredPar

http://msdn.Microsoft.com/en-us/library/sf0df423.aspx および http://msdn.Microsoft.com/en-us/library/ c3ay4x3d%28VS.80%29.aspx 、できます

using gen = System.Collections.Generic;
using GenList = System.Collections.Generic.List<int>;

そして使用する

gen::List<int> x = new gen::List<int>;

または

GenList x = new GenList();

ただし、使用するすべてのファイルで定義を使用してそれらを複製する必要があるため、将来それらに変更を加え、すべてのファイルで更新するのを忘れると、事態はひどく壊れます。

将来のC#では、エイリアスを拡張メソッドで行うように処理し、他の場所で使用するファイルでそれらの多くを定義し、1つの場所でそれらを維持し、タイプコンシューマーから内部の不要なタイプマッピングの詳細を非表示にすることを願っています。

8
George Birbilis