выражение типа 'T' не может быть обработано шаблоном типа '<null>' - PullRequest
0 голосов
/ 24 апреля 2019

Вот минимальный образец:

class C {
  public bool F<T>(T x) => x is null;
}

Настоящий код, вызывающий проблему, находится здесь https://github.com/kofifus/With/blob/master/With.cs#L35

До сегодняшнего дня это скомпилировано нормально, но я только что обновился до

Microsoft Visual Studio Community 2019 Preview Версия 16.1.0 Preview 2,0

Код теперь ошибки с:

Error CS8511 An expression of type 'T' cannot be handled by a pattern of type '<null>'. Please use language version 'preview' or greater to match an open type with a constant pattern.

Что здесь происходит? и как правильно решить эту проблему?

note1 - Я не хочу предпросмотр языка C # ATM
примечание 2 - это все еще компилируется, если я изменяю x is null на x==null

Ответы [ 2 ]

4 голосов
/ 24 апреля 2019

В дополнение к упомянутому решению, тот факт, что это работало на вас , вероятно, вызван ошибкой в ​​предварительном просмотре 2019 года .

Однако в Visual Studio 2019 мы неправильно разрешили это компилировать в языковых версиях 7.0, 7.1, 7.2 и 7.3. В Visual Studio 2019, обновление 1, мы допустим ошибку (как это было в Visual Studio 2017) и предложим обновить до предварительного просмотра или версии 8.0.

Похоже, что разрешение is null в открытых дженериках будет частью C # 8 и отстаивается здесь . Ошибка, вероятно, в конечном итоге скажет вам обновиться до C # 8 (вместо «предварительного просмотра») после ее выпуска.

1 голос
/ 24 апреля 2019

Я очень сомневаюсь в вашем утверждении, что это всегда работало.

Обновление

Если оно работало в предыдущем предварительном просмотре , это, вероятно, было связано ск языковой функции, которая была сброшена

Возможно, вы пытаетесь сравнить с null, то есть ==

public bool F<T>(T x) => x == null;

Однако, более надежный способ проверки универсальности на равенство заключается в EqualityComparer<T>.Default.Это учитывает IEquatable<T> без бокса, а также object.Equals и обрабатывает все Nullable<T> и поднятые нюансы обнуляемые типы

public bool F<T>(T x) => EqualityComparer<T>.Default.Equals(x, default(T));

Update

Просто для записи, (, как вы можете видеть здесь )

public bool F<T>(T x) => !(x is object);

В основном просто компилируется в

public bool F<T>(T x)
{
    return x == null;
}

Что совпадает с

public bool F<T>(T x) => x == null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...