【问题标题】:Using the is operator with unconstrained generics将 is 运算符与不受约束的泛型一起使用
【发布时间】: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

标签: c# msbuild visual-studio-2017 visual-studio-2019 c#-7.2


【解决方案1】:

这确实是一个错误。那里使用的模式是 C# 8.0 模式,当语言版本设置为 7.2 时不应编译。不过,这已经在我们的代码库中报告并修复了。它将在 VS2019 Update 2 附带的 MSBuild 中提供。

【讨论】:

    【解决方案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,但显然不需要)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多