Оператор??'не может быть применен к операндам типа' T ' и 'T'
У меня есть следующий общий метод, но VS дает мне ошибку компиляции на этом. (Оператор'??'не может быть применен к операндам типа' T 'и'T')
public static T Method<T>(T model) where T : new()
{
var m = model ?? new T();
}
кто-нибудь знает, почему?
Edit: возможно ли, что причина в том, что T может быть структурой в моем случае, а структура не является нулевым типом?
8 ответов:
вы должны добавить
class
ограничения:public static T Method<T>(T model) where T : class, new() { var m = model ?? new T(); return m; }
и вы должны вернуть
m
слишком!Примечание: как отметил @KristofDegrave в своем комментарии, причина, по которой мы должны добавить
class
ограничение связано с тем, что T может быть типом значения, напримерint
и с??
оператор (null-coalescing) проверяет типы, которые могут быть null, поэтому мы должны добавитьclass
ограничение для исключения типов значений.Edit: ответ Элвина Вонга охватывал случай для типов с нулевым значением тоже; какие структуры на самом деле, но могут быть операндами ?? оператор. Просто знайте, что
Method
вернутсяnull
без перегруженной версии Элвина, для типов с нулевым значением.
??
- это нуль-коалесцирующий оператора. Он не может быть применен к ненулевым типам. Так какT
может быть что угодно, это может бытьint
или другой примитивный, ненулевой тип.если вы добавите условие
where T : class
(должно быть указано передnew()
) это силT
быть экземпляром класса, который может быть обнулен.
многие уже указали, что добавление
class
ограничение для общего решит проблему.Если вы хотите, чтобы ваш метод был применим к
Nullable<T>
тоже можно добавить перегрузку для него:// For reference types public static T Method<T>(T model) where T : class, new() { return model ?? new T(); } // For Nullable<T> public static T Method<T>(T? model) where T : struct { return model ?? new T(); // OR return model ?? default(T); }
вам нужно указать, что ваш
T
тип-это класс с ограничением на общий тип:public static T Method<T>(T model) where T : class, new() { return model ?? new T(); }
Так как T может быть любого типа, нет никакой гарантии, что T будет иметь статический ?? оператор или что тип T является нулевым.
?? Операторов (Справочник По C#)
в ?? оператор называется оператором слияния нулей и используется для определить значение по умолчанию для типы значений с нулевым значением или ссылка типы.
почему-то
??
оператор не может быть использован для ненулевых типов, даже если он должен быть эквивалентенmodel == null ? new T() : model
и are допускается сравнение null с типом, не допускающим null.вы можете получить именно то, что вы ищете без каких-либо дополнительных ограничений при использовании тернарного оператора, или оператор if:
public static T Method<T>(T model) where T : new() { var m = model == null ? new T() : model; }