C # не имеет такого рода ограничений. Ограничение должно иметь форму «R должен быть конвертируемым в X»; мы не поддерживаем ограничения вида «R должен быть конвертируемым из X».
Что вызывает сожаление, поскольку облегчает некоторые сценарии, связанные с контравариантными преобразованиями.
Кстати, Scala допускает такое ограничение.
Интересно, что вы можете делать то, что вы хотите, с помощью метода расширения, но тогда вы должны быть избыточны при вызове:
public static IEnumerable<R> SafeCast<T, R>(this IEnumerable<T> x) where T : R
{
return x.Cast<R>();
}
Теперь вы можете сказать:
IEnumerable<Giraffe> giraffes = whatever;
IEnumerable<Animal> animals = giraffes.SafeCast<Giraffe, Animal>();
В C # 4 ваш код будет в основном ненужным; IEnumerable<T>
безопасно ковариантен в T в C # 4 , если T является ссылочным типом .