将 is 运算符与不受约束的泛型一起使用
Posted
技术标签:
【中文标题】将 is 运算符与不受约束的泛型一起使用【英文标题】:Using the is operator with unconstrained generics 【发布时间】:2019-10-02 20:06:03 【问题描述】: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 永远不会为空。我很高兴,一切都很好。
但是我的构建服务器并不满意。它正在使用 MSBuild v15.5.180.51428 并引发编译器错误,提示
错误 CS0403:无法将 null 转换为类型参数“TValue”,因为它可能是不可为 null 的值类型。考虑使用'default(TValue)'
这也发生在使用 VS2017 的同事机器上
此“修复/更改”是否已记录在案。它适用于哪个版本的 MSBuild?
谢谢
【问题讨论】:
将is
更改为==
?
尝试使用'return thing is default;',这将适用于其他对象
感谢史蒂夫和鲁弗斯。我有解决办法。我更想知道是否有人知道它何时改变
我相信obj is null
是在C#7中添加的
fyi 我在 GH 问题上询问了讨论语言更改以澄清 C# 语言和编译器版本,这是允许的:github.com/dotnet/csharplang/issues/1284#issuecomment-492767345
【参考方案1】:
这确实是一个错误。那里使用的模式是 C# 8.0 模式,当语言版本设置为 7.2 时不应编译。不过,这已经在我们的代码库中报告并修复了。它将在 VS2019 Update 2 附带的 MSBuild 中提供。
https://github.com/dotnet/roslyn/issues/34678【讨论】:
【参考方案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,但显然不需要)。
【讨论】:
以上是关于将 is 运算符与不受约束的泛型一起使用的主要内容,如果未能解决你的问题,请参考以下文章