Ответ 1
Ближе всего вы можете получить ограничение времени выполнения.
Изменить. Первоначально я поставил проверку выполнения во время вызова конструктора. Это на самом деле не оптимально, так как оно накладывает дополнительные накладные расходы на каждый экземпляр; Я считаю, что было бы гораздо разумнее поставить проверку в статический конструктор, который будет вызываться один раз для каждого типа, используемого в качестве параметра T
для вашего типа Blah<T>
:
public class Blah<T> {
static Blah() {
// This code will only run ONCE per T, rather than every time
// you call new Blah<T>() even for valid non-string type Ts
if (typeof(T) == typeof(string)) {
throw new NotSupportedException("The 'string' type argument is not supported.");
}
}
}
Очевидно, что он не идеален, но если вы помещаете это ограничение на место и документируете тот факт, что string
не является аргументом поддерживаемого типа (например, через комментарии XML), вы должны получить где-то около эффективности ограничения времени компиляции.