2
class A { }
interface I { }
void GenericStuff<T>(T x) { }
void SpecificStuff<T>(T x) where T : A, I { }

void Start<T>(T x)
{
    if (x is A && x is I)
        SpecificStuff(x); // <---- Wrong type
    else
        GenericStuff(x);
}

上記のような状況になりました。メソッドStart()では、単一のパラメーターを取得し、そのxタイプに応じて、GenericStuff()またはSpecificStuff()メソッドを呼び出します。当然、型制約がそうするのを妨げており、それらが 2 つあるため、キャストによってそれらを回避することはできません。

これを達成する方法はありますか?

4

1 に答える 1

5

使用できますdynamic。これは多かれ少なかれ美化された反射ですが、はるかに見栄えがします。

void Start<T>(T x)
{
    if (x is A && x is I)
        SpecificStuff((dynamic)x);
    else
        GenericStuff(x);
}

注意:
後で の型制約を変更しSpecificStuffて 3 番目のインターフェイスを含めるようにし、それに応じて を更新するのを忘れたif場合、実行時例外が発生し、コンパイル時エラーは発生しません。

于 2013-04-04T10:16:50.210 に答える