Если я хотел бы написать метод, который принимает переменное число «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
}
}
}