1

私はインターフェースを実装する基本クラスを持っています。これは非常に単純化されており、次のようになります。

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番目のオプションを使用して解決しましたが、なぜこれが機能しないのか非常に興味があります。何か案は?

4

0 に答える 0