TDerived がクラス "Base" の任意のサブクラスである "TDerived" の可変数を取るメソッドを書きたい場合、これを行う方法はありますか?
次のコードは、1 つの特定の指定されたサブクラスでのみ機能します。
void doStuff<TDerived>(params TDerived[] args) where TDerived : Base
{
//stuff
}
つまり、私が持っている場合
class Super { }
class Sub0 : Super { }
class Sub1 : Super { }
それなら私にはできない
Sub0 s0 = new Sub0();
Sub1 s1 = new Sub1();
doStuff(s0, s1);
「最適なオーバーロードされた一致...いくつかの無効な引数があります」と表示されるためです。
コンパイラが型制約と可変個引数関数をどのように処理するかに関係なく、これは (私が知る限り) 完全に型安全であるように見えます。キャストできることはわかっていますが、これがタイプセーフである場合、許可しないのはなぜですか?
編集:
おそらくより説得力のある例:
void doStuff<TDerived>(params SomeReadOnlyCollection<TDerived>[] args) where TDerived : Base
{
foreach(var list in args)
{
foreach(TDerived thing in list)
{
//stuff
}
}
}