私はインターフェースを実装する基本クラスを持っています。これは非常に単純化されており、次のようになります。
interface I
{
void DoStuff<T>(T t) where T : class;
}
class A : I
{
public virtual void DoStuff<T>(T t) where T : class
{
// do some work
System.Console.WriteLine(t);
}
}
私はこのクラスから次のように派生しています:
class B : A
{
public override void DoStuff<T>(T t)
{
DoMoreSpecificStuff(() => { base.DoStuff(t); });
}
public void DoMoreSpecificStuff(Action action)
{
// set some stuff up before calling the action
action();
// tear some stuff down
}
}
特殊化されたクラスは、次のように使用されます。
I i = new B();
i.DoStuff("Hello World");
VerificationException
これにより、実行時にメッセージがスローされますMethod Constraints.A.DoStuff: type argument 'T' violates the constraint of type parameter 'T'.
。
この問題は次のいずれかで修正できます * クロージャ() => { new A().DoStuff(t); }
を作成する * メソッドを作成するB.BaseDoStuff<T>(T t) where T : class { base.DoStuff(t); }
2番目のオプションを使用して解決しましたが、なぜこれが機能しないのか非常に興味があります。何か案は?