Непоследовательное поведение при обработке ссылочных типов C# 8 с обобщениями - PullRequest
4 голосов
/ 07 января 2020

У меня есть этот код:

public T? Foo<T>()
    where T : class?
{
    return null;
}

Это дает логическую и ожидаемую ошибку:

Параметр типа Nullable должен быть известен как тип значения или не Обнуляемый ссылочный тип. Попробуйте добавить ограничение 'class', 'struct' или type.

Теперь я добавлю еще одно ограничение:

public T? Foo<T>()
    where T : class?, IDisposable // Could be any interface I guess
{
    return null;
}

Теперь достаточно интересная ошибка только что исчезла. Хотя мне действительно кажется, что у нас противоречивые ограничения, так как интерфейс non-nullalbe, а class? -

Я что-то здесь упускаю или есть проблема с компилятором?

1 Ответ

4 голосов
/ 07 января 2020

Типовое ограничение c where T : IDisposable означает, что "T не должно иметь значения NULL и должно реализовывать IDisposable". Если у вас есть несколько общих типовых ограничений c с различными значениями обнуляемости, общее ограничение обнуляется только в том случае, если все ограничения обнуляются.

Таким образом, тот факт, что class? обнуляется, переопределяется тем фактом, что IDisposable это не.

Вам нужно where T : class?, IDisposable?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...