如果我想编写一个采用可变数量“TDerived”的方法,其中 TDerived 是“Base”类的任何子类,有什么办法可以做到这一点?
以下代码仅适用于单个特定的指定子类:
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
}
}
}