C#版本:7.2
我的Ms Build版本:未知(如果有人可以告诉我如何在我的计算机上找到它)
我的Visual Studio版本:Visual Studio Professional 2019
我将把它简化到最低限度,所以不要理会代码的简单性。
public bool IsNull<T>(T thing)
{
return thing is null;
}
在Visual Studio 2019中,这很好并且可以编译。
我可以这样称呼
IsNull(0); //thats an int
,并且它编译并返回false,因为int永远不会为null。我很高兴,一切都很好。
但是我的构建服务器不满意。它使用的是MSBuild v15.5.180.51428,并引发编译器错误,提示
错误CS0403:无法将null转换为类型参数'TValue',因为它可能是非空值类型。考虑使用'default(TValue)'
这也发生在使用VS2017的同事计算机上
已记录此“修复/更改”。它提供什么版本的MSBuild?
谢谢
答案 0 :(得分:3)
这确实是一个错误。此处使用的模式是C#8.0模式,并且当语言版本设置为7.2时不应编译。但是已经在我们的代码库中对此问题进行了报告和修复。它将在VS2019 Update 2随附的MSBuild中提供。
答案 1 :(得分:2)
编辑:这是VS 2019中的一个编译器错误-此功能仅在C#8中并且从VS 2019 Update 1开始,您需要启用C#8才能摆脱此消息。
这是在编译器中进行的更改-您至少需要Visual Studio 2019工具(MSBuild 16)才能生成此代码。
这已在VS 2019的PR中实现:recursive-patterns(18): Permit a constant pattern to be used with an open type as input(尽管我的印象是需要为此启用C#8,但显然不需要)。