У меня есть общий метод с этим (фиктивным) кодом (да, я знаю, что в IList есть предикаты, но мой код использует не IList, а какую-то другую коллекцию, в любом случае это не имеет значения для вопроса ...)
static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}
Это дает мне ошибку сборки
«Невозможно преобразовать значение NULL в тип параметра« T », поскольку это может быть тип значения. Попробуйте вместо этого использовать« default (T) ».»
Могу ли я избежать этой ошибки?
null
независимо от того,T
естьObject
илиint
естьchar
.Ответы:
Два варианта:
default(T)
что означает, что вы вернётесь,null
если T является ссылочным типом (или типом значения Nullable),0
дляint
,'\0'
дляchar
и т. Д. ( Таблица значений по умолчанию (C # Reference) )where T : class
ограничением, а затем вернутьnull
как обычноисточник
Nullable<int>
илиNullable<DateTime>
вместо. Если вы используете ненулевой тип и хотите представить нулевое значение, вы просто напрашиваетесь на неприятности.источник
Вы можете просто настроить свои ограничения:
Тогда возврат нуля разрешен.
источник
IDisposable
. Да, большую часть времени это не должно быть.System.String
не реализуетIDisposable
, например. Ответчик должен был это уточнить, но это не делает ответ неверным. :)Добавьте ограничение класса в качестве первого ограничения к вашему универсальному типу.
источник
Если у вас есть объект, то нужно выполнить Typecast
если вам нужно вернуть ноль.
источник
Ниже приведены два варианта, которые вы можете использовать
или
источник
Другой вариант - добавить это в конец вашей декларации:
Таким образом, это позволит вам вернуть ноль.
источник
where T : class, IList
. Если у вас есть ограничения на разные типы, вы повторяете токенwhere
, как вwhere TFoo : class where TBar : IList
.решение TheSoftwareJedi работает,
также вы можете заархивировать его, используя пару типов value и nullable:
источник
Примите рекомендацию об ошибке ... и либо пользователь,
default(T)
либоnew T
.Вам нужно будет добавить сравнение в ваш код, чтобы убедиться, что оно соответствует действительности, если вы идете по этому пути.
В противном случае, потенциально рассмотрите выходной параметр для "совпадение найдено".
источник
Вот рабочий пример для возвращаемых значений Nullable Enum:
источник
where TEnum : struct, Enum
. Это гарантирует, что вызывающая сторона не предоставит случайно тип значения, который не является перечислением (такой какint
или aDateTime
).Еще одна альтернатива 2 ответам, представленным выше. Если вы измените свой тип возврата на
object
, вы можете вернутьсяnull
, и в то же время привести ненулевой возврат.источник
Для полноты картины полезно знать, что вы также можете сделать это:
Возвращает так же, как
return default(T);
источник
Для меня это работает как есть. Где именно проблема?
источник