Подтвердить что ты не робот

Как указать типы, не разрешенные в ограничении .NET Generics?

Можно ли указать ограничение на общий класс, который запрещает определенные типы? Я не знаю, возможно ли это, и если да, то я не уверен, что такое синтаксис. Что-то вроде:

public class Blah<T> where : !string {
}

Я не могу найти никаких обозначений, которые позволили бы такое ограничение.

4b9b3361

Ответ 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), вы должны получить где-то около эффективности ограничения времени компиляции.

Ответ 2

Нет, вы не можете напрямую указывать ограничения типа "отрицания".

Ответ 3

Ограничения могут быть только положительными ограничениями, как указано в документации.

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

Ответ 4

Ниже приведены допустимые ограничения (подробнее)

  • где T: struct
  • где T: class
  • где T: new()
  • где T: [имя базового класса]
  • где T: [имя интерфейса]
  • где T: U (Аргумент типа, предоставленный для T, должен быть или получен из аргумента, предоставленного для U)