Оператор '??' не может применяться к операндам типа "T" и "T",
У меня есть следующий общий метод, но VS дает мне ошибку компиляции. (Оператор '??' не может применяться к операндам типа 'T' и 'T')
public static T Method<T>(T model) where T : new()
{
var m = model ?? new T();
}
Есть ли у кого-нибудь идеи, почему?
Изменить: возможно, причина в том, что T может быть структурой в моем случае, а struct - непустым типом?
Ответы
Ответ 1
Вы должны добавить ограничение class
:
public static T Method<T>(T model) where T : class, new()
{
var m = model ?? new T();
return m;
}
И вы также должны вернуться m
!
Примечание. Как отметил в своем комментарии @KristofDegrave, причина, по которой мы должны добавить ограничение class
, состоит в том, что T может быть типом значений, например int
, и поскольку оператор ??
(нуль-коалесцирование) проверяет типы, которые могут быть пустыми, поэтому нам нужно добавить ограничение class
, чтобы исключить типы значений.
Редактировать: ответ Элвина Вонга также охватывал случай с нулевыми типами; которые на самом деле являются структурами, но могут быть операндами оператор. Просто имейте в виду, что Method
вернет null
без перегруженной версии Alvin для типов с нулевым значением.
Ответ 2
??
- оператор нуль-коалесцирования. Он не может быть применен к типам, не подлежащим обнулению. Так как T
может быть чем угодно, это может быть int
или другой примитивный тип с недопустимым значением.
Если вы добавите условие where T : class
(должно быть указано до new()
), оно заставляет T
быть экземпляром класса, который может быть обнулен.
Ответ 3
Многие уже указали, что добавление ограничения 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);
}
Ответ 4
Вам нужно указать, что ваш тип T
- это класс с ограничением на общий тип:
public static T Method<T>(T model) where T : class, new()
{
return model ?? new T();
}
Ответ 5
Так как T может быть любым типом, нет гарантии, что T будет иметь статическую?? оператора или что тип T является нулевым.
?? Оператор (ссылка на С#)
оператор называется нуль-коалесцирующим оператором и используется для определить значение по умолчанию для типов с нулевым значением или ссылки Типы.
Ответ 6
По какой-то причине оператор ??
не может использоваться для типов с непустым значением, даже если он должен быть эквивалентен model == null ? new T() : model
, и вам разрешено сопоставление с нулевым типом. /p >
Вы можете получить именно то, что ищете, без каких-либо дополнительных ограничений, используя вместо этого тернарный оператор или оператор if:
public static T Method<T>(T model) where T : new()
{
var m = model == null ? new T() : model;
}
Ответ 7
model ?? new T()
означает model == null ? new T() : model
. Не гарантируется, что модель не имеет значения NULL, а ==
не может применяться для null
и объекта, не подлежащего обнулению. Необходимо сменить ограничение на where T : class, new()
.
Ответ 8
Mark T как "класс", и вам хорошо идти.