Как я могу вернуть NULL из универсального метода в C #? - PullRequest
495 голосов
/ 19 ноября 2008

У меня есть универсальный метод с этим (фиктивным) кодом (да, я знаю, что в 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.
}

Это дает мне ошибку сборки

"Невозможно преобразовать ноль в параметр типа 'T', потому что это может быть тип значения. Попробуйте вместо этого использовать default (T).

Можно ли избежать этой ошибки?

Ответы [ 11 ]

0 голосов
/ 14 июля 2018

Еще одна альтернатива 2 ответам, представленным выше. Если вы измените тип возврата на object, вы можете вернуть null, в то же время приведя к ненулевому возвращению.

static object FindThing<T>(IList collection, int id)
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return (T) thing;
    }
    return null;  // allowed now
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...