2017-09-12 14 views
0

私は先週、一般的な制約を大いに学んできました。それらをもっと深く学びながら、何らかの方法で逆転させることができるのであれば私は不思議に思った。私が働いている人々は、そのようなものが存在し、私のGoogleの検索も何も出てこないことを確信していません。一般的な制約を反転する

私が得た答えは、クラスの代わりに構造体を使うことでしたが、なぜこの人はまともな答えだと思っていましたが、ほとんどの用途でうまくいくと思うのですが、制約を反転させる方法。

制約を逆転することができるかどうか他の誰かが知っていますか?

class myClass<T> where T: !class 
{ 
} 
+2

'T:!class'は'どこT:struct'と言うことができますか...なぜそのような逆変換表記が必要なのですか? – Rahul

+0

@Rahul - これは単なる例です。制約は、例えばインターフェースとすることもできる。 – Kobi

+1

@Rahulは第2段落 –

答えて

3

いいえ、C#ではそのような構文はありません。

MSDNから:

次の表は、制約の6種類一覧表示されます:構造体型引数は値型でなければなりません:T

を。 Nullable以外の値型を指定できます。詳細については、Nullableを使用する のタイプを参照してください。 T:class型引数は、参照型である でなければなりません。これは、クラス、インターフェイス、デリゲート、 または配列タイプにも適用されます。

ここで、T:new() type引数には、パブリックな パラメータのないコンストラクタが必要です。他の制約と共に使用する場合は、 new()制約を最後に指定する必要があります。

ここで、T:(基底クラス名) type引数は、指定された基底であるか、または指定された基底 クラスから派生している必要があります。

ここでT:(インターフェイス名) type引数は、または である必要があります。指定したインターフェイスを実装します。複数のインタフェース制約は と指定できます。制約インターフェースはまた、一般的であり得る。 UはT、指定された型引数があるか、U.

のために供給さ 引数から派生しなければなりませんので、TがU以外の任意のタイプですを言うするオプションはありません:Tは

はそれについてこのように考えて - あなたは

class myClass<T> where T: !string 
{ 
} 

あなたのkを持っていたと仮定します今すぐTは文字列ではありませんが、は、がである可能性があることを他に示していません。それでは、どうやってコード化していますか?これらは、すべての有効なdelcarations次のようになります。

var x1 = new myClass<int>(); 
var x2 = new myClass<object>(); 
var x3 = new myClass<DateTime>(); 
var x4 = new myClass<DataTable>(); 

は何のコードを、あなたはそれがこれらのタイプのすべてに適用される可能性がありますが、stringに無効なのでしょうか?

関連する問題