フレームワークには、特殊な特性をそれらから派生したすべての型に効果的に渡すが、それら自体の特性を持たない特定のクラスがあります。CLR自体は、これらのクラスを制約として使用することを禁止していませんが、それらに制約されているジェネリック型は、具象型のように非継承特性を取得しません。C#の作成者は、そのような動作は一部の人々を混乱させる可能性があり、有用性を確認できなかったため、CLRでのように動作させるのではなく、そのような制約を禁止する必要があると判断しました。
場合は、例えば、1を書き込むことが許されました:void CopyArray<T>(T dest, T source, int start, int count)
; 型の引数を期待するメソッドに渡しdest
たりsource
、メソッドに渡すことができSystem.Array
ます。さらに、一つはコンパイル時の検証ことになるだろうdest
し、source
互換性のある配列型だったが、一つは使用して、配列のアクセス要素にできないだろう[]
演算子。
前者の方法が機能するほとんどすべての状況で機能するArray
ため、制約として使用できないことは、ほとんどの場合回避するのが非常に簡単void CopyArray<T>(T[] dest, T[] source, int start, int count)
です。ただし、弱点があります。前者の方法は、引数の一方または両方が型であるというシナリオSystem.Array
で機能し、引数が互換性のない配列型である場合を拒否します。両方の引数が型であるオーバーロードを追加するSystem.Array
すると、コードは受け入れるべき追加のケースを受け入れますが、受け入れられないケースを誤って受け入れます。
特別な制約のほとんどを非合法化する決定は厄介だと私は思います。意味論的な意味を持たない唯一のものは、System.Object
[それが制約として合法であるならば、何でもそれを満足するであろうから]であろう。 System.ValueType
型の参照はValueType
値の型とあまり共通点がないため、おそらくあまり役に立ちませんが、Reflectionが関係する場合には、おそらく何らかの値を持つ可能性があります。両方System.Enum
とSystem.Delegate
いくつかの実際の用途がありますが、C#のクリエイターは、それらが正当な理由なく非合法化している彼らは考えていなかったからです。