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

Оператор '??' не может применяться к операндам типа "T" и "T",

У меня есть следующий общий метод, но VS дает мне ошибку компиляции. (Оператор '??' не может применяться к операндам типа 'T' и 'T')

public static T Method<T>(T model) where T : new()
{
    var m = model ?? new T();
}

Есть ли у кого-нибудь идеи, почему?

Изменить: возможно, причина в том, что T может быть структурой в моем случае, а struct - непустым типом?

4b9b3361

Ответ 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 как "класс", и вам хорошо идти.