Использование предложения класса в ограничении универсального типа, когда ограничение уже содержит интерфейс - PullRequest
0 голосов
/ 16 февраля 2019

Думаю, я знаю почему, но было бы очень признательно, если бы кто-то мог объяснить мне, почему, когда я пишу этот метод, где IStoreable - это интерфейс:

public bool TryRetrieveItem<T>(string itemKey, out T item) where T : IStoreable
{
    item = default(T);

    if (this.RetrieveItem(itemKey, out IStoreable retItem))
    {
        item = (retItem as T);
        return true;
    }

    return false;
}

Жалуется на это item = (retItem as T);

И чтобы исправить это, я должен добавить ограничение class к предложению where.

Зачем мне это делать, поскольку я уже ограничиваю T на интерфейсе?Это потому, что интерфейсы могут быть реализованы не ссылочными типами?Или, может быть, я неправильно понял детали?

1 Ответ

0 голосов
/ 16 февраля 2019

Это потому, что интерфейсы могут быть реализованы не ссылочными типами?

Да.

Используемый вами оператор as может выполнять только преобразования ссылочных типов,Он пытается преобразовать переменную в нужный тип.Если это не удается, выражение оценивается как null.Он не работает с типами значений, поскольку типы значений не могут быть null.

. Поэтому вам необходимо ограничить T классом.

В качестве альтернативы вы можете изменить as на бросок.

item = (T)retItem;

Если вы сделаете это, вам не нужно ограничение ссылочного типа для T, но оно выдаст исключение, если не удастся преобразовать.

Третий вариант будетпроверить тип retItem, используя сопоставление с образцом:

if (retItem is T t) {
    item = t;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...