2010-10-01 4 views
4

Я знаю, что могу сделать метод какC# родовое * не * реализовать что-то

private T MyFun<T>() 
    where T : IMyInterface 
{...} 

Могу ли я сделать обратное, то есть, где T не реализует IMyInterface? Конкретный вариант использования заключается в том, что я не хочу допускать nullables, но мне любопытно вообще.

+0

Даже если вы * можете * исключить конкретный * интерфейс * (или базовый тип), как бы вы использовали это, чтобы исключить 'Nullable ' для любого 'T'? Даже с этой функцией вы не можете этого сделать. – Timwi

ответ

0

Нет, в общем случае вы не можете указать «список исключений». Однако, чтобы предотвратить допустимость типов Nullable, вы можете использовать ограничение «where T: class». Поскольку Nullable - это структура, которая будет иметь желаемый эффект.

Редактировать: Ой, похоже, что я был слишком поспешным - вы спрашивали, как предотвратить то, что может быть пустым или, в частности, Nullable, от допуска?

+0

Предположим, что для гипотетических целей он хочет предотвратить использование «Nullable ' '. С ограничением 'T: class' вы исключили * all * structs, а не только' Nullable '. –

+0

Правда - как указано, нет такого понятия, как ограничение «исключение». Это единственный способ, с общими ограничениями, которые я знаю, чтобы исключить Nullable . По общему признанию, он меньше идеала - как вы заметили! – Ben

+0

Интересно, что ограничение 'where T: struct' * также * исключает' Nullable '. Поэтому, если OP точно знает, что он хочет только типы значений или ссылочные типы, один из них будет работать. –

2

Если вы не хотите типы с нулевым значением, вы можете это сделать.

private T MyFun<T>() 
    where T : struct 
{...} 
0

Вы всегда можете просто выбросить NotSupportedException() во время выполнения. По общему признанию, не так хорошо, как компилятор, предотвращающий его.

Смежные вопросы