这是一个最小的样本:
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
,它仍会编译
我非常怀疑你的断言总是奏效的。
更新
如果它在之前的预览中有效,则可能是由于语言功能被转储
可能你想与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;
添加到提到的解决方案,这曾经是为你工作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(而非“预览”)。