“T”类型的表达式无法通过类型'的模式处理 “

问题描述 投票:0回答:2

这是一个最小的样本:

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

导致问题的真正代码在这里https://github.com/kofifus/With/blob/master/With.cs#L35

直到今天这个编译好了,但我刚升级到

Microsoft Visual Studio社区2019预览版16.1.0预览版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 note2 - 如果我将x is null改为x==null,它仍会编译

c# c#-7.0 visual-studio-2019 c#-8.0 c#-7.3
2个回答
1
投票

我非常怀疑你的断言总是奏效的。

更新

如果它在之前的预览中有效,则可能是由于语言功能被转储

可能你想与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

仅供记录,(as you can see here

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;

4
投票

添加到提到的解决方案,这曾经是为你工作is likely to be caused by a bug in the 2019 preview的事实。

但是,在Visual Studio 2019中,我们不正确地允许在语言版本7.0,7.1,7.2和7.3中进行编译。在Visual Studio 2019 Update 1中,我们将使其成为错误(就像在Visual Studio 2017中一样),并建议更新到预览或8.0。

似乎允许开放仿制药中的is null将成为C#8的一部分,并且是championed here。该错误很可能最终会在发布后tell you to upgrade to C#8(而非“预览”)。

© www.soinside.com 2019 - 2024. All rights reserved.