制約(クラスまたはジェネリックメソッド)がメソッド自体にどのように影響するかを理解しようとしています。たとえば、このコードを取る:オーバーライドされたジェネリックメソッドの制約
class Base<T> where T:class, IComparable<T>
{
public virtual void Method(T obj) { }
}
class Derived<T> : Base<T> where T:class, IComparable<T>, IEnumerable<T>
{
public override void Method(T obj) { }
}
このコードは、罰金コンパイルとコンパイラ/ランタイムがジェネリック型であるパラメータを取る非ジェネリックメソッド「メソッド」に多型の呼び出しを解決することができます。基本クラスと派生クラスでは、型パラメーターの制約が異なります。
また、値型のインスタンス化ごとに異なるクラスが生成され、参照型に対してそのようなクラスが1つだけインスタンス化されるため、おそらく問題の可能性がある値型を保持するようにクラス制約を指定しました。
一方、次のコードはコンパイルされません。
class Base
{
public virtual void Method<T>() where T : class, IComparable<T> { }
}
class Derived : Base
{
public override void Method<T>() where T : class, IComparable<T>, IEnumerable<T> { }
}
のC#の言語仕様では、それがオーバーライドするメソッドにあり、のような制約を指定することは違法であることと、一般的な方法に制約が引き継がれていることを述べています。私はGoogleでそれを検索していましたが、多態呼び出しのサポートに関連する複雑さ(メソッドテーブルの維持などに関して)が禁止されていることがわかりました。しかし、私はまだそれが一般的なクラスであることを除いて、上記のケース1でこれが似ている理由を理解していません。ケース2はコンパイラエラーとしてフラグが立てられていますが、コンパイラ/ランタイムはケース1でどのように実行できますか?
ケース1基本クラスがあり、両方とも汎用性があります –
@EhsanSajjad - so?最初のケースでは、それは汎用クラスであり、後者ではそれがメソッドです。インスタンス化を1つだけに制限する 'クラス制約'を指定していませんか?だから、もう一方はうまくいくのに対して、なぜ許可されないのですか? – Madhusudhan