Я хочу реализовать универсальный метод на универсальный класс, который позволил бы бросить безопасно, смотрите пример:Как сделать безопасный листинг с использованием дженериков в C#?
public class Foo<T> : IEnumerable<T>
{
...
public IEnumerable<R> SafeCast<R>()
where T : R
{
return this.Select(item => (R)item);
}
}
Однако компилятор говорит мне, что Foo<T>.SafeCast<R>() does not define parameter 'T'
. Я понимаю это сообщение, что не могу указать ограничение на T
в методе, так как оно не определено в методе. Но как я могу указать обратное ограничение?
Какое поведение вы ожидаете, если T не является производным от R? – Jake
@ Jake: намерение здесь состоит в том, что если R не выбрано так, что T можно конвертировать в R, то программа не скомпилируется. Например, у вас может быть Foo f и скажем f.SafeCast