【问题标题】:C# 7 Use Pattern Matching not workingC# 7 使用模式匹配不起作用
【发布时间】:2017-04-04 16:56:26
【问题描述】:

我在这里错过了什么。

Visual Studio 告诉我使用内联模式匹配并为我重新编写代码,但当我收到错误消息时:

严重性代码描述项目文件行抑制状态 错误 CS8121 TReturnState 类型的表达式无法由 LightState 类型的模式处理。 DataModels C:\Users\Michael\Documents\windows\GCMS UWP\Models\Models\Elements\Lights\Light.cs 77 活动

这是原始代码:

    public override void UpdateState<TReturnState>(TReturnState returnState)
    {
        var newState = returnState as LightState;

        if (newState != null)
            State = newState;

        base.UpdateState(returnState);
    }

这是 VS 为我重做时的样子。

    public override void UpdateState<TReturnState>(TReturnState returnState)
    {
        if (returnState is LightState newState)
            State = newState;

        base.UpdateState(returnState);
    }

我更喜欢调整后的方式,但我得到了错误。我错过了什么还是这是一个错误?

我正在使用的包:

  "dependencies": {
    "Microsoft.NETCore.UniversalWindowsPlatform": "5.3.1",
    "Newtonsoft.Json": "9.0.1",
    "System.ValueTuple": "4.3.0"
  },

【问题讨论】:

  • State = (LightState)newState;
  • @SirRufo 它更新一个名为“State”的全局变量怎么没用?
  • @Hogan 哎呀,你是对的...... :o)
  • @Hogan 我也收到了一个错误...并且 Visual Studio 告诉我这是不必要的演员表。

标签: c# pattern-matching c#-7.0


【解决方案1】:

正如@SirRufo 在评论中指出的那样,它似乎是 C# 7 中的一个已知错误。

解决方法是编写带有强制转换的代码到一个对象。

    public override void UpdateState<TReturnState>(TReturnState returnState)
    {
        if ((object)returnState is SpeakerState newState)
            State = newState;

        base.UpdateState(returnState);
    }

但是;这不是真正的修复,而是克服错误的技巧。 Visual Studio 还告诉我,这种对对象的强制转换是不必要的,并尝试修复它,但当它修复时,我再次收到错误。

这阻碍了通过 Visual Studio 进行完整的代码重构。

Link to known issue posted by Sir Rufo.

编辑:升级到 C# 7.1 解决了模式匹配匿名类型的装箱问题,现在它可以正常工作,没有开销。

【讨论】:

  • 使用了你的方法但对我不起作用,也将 Visual Studio 更新到 15.3.5 版本不起作用
  • @MohammadSadeghipour 升级到 C# 7.1。它现在可以正确地匹配匿名类型,就像它应该做的那样。
  • 我按照你说的做了,但它仍然无法处理以下错误:错误 CS1617:/langversion 的选项 '7.1' 无效;必须是 ISO-1、ISO-2、默认值或 1 到 6 范围内的整数。
  • 你能把代码贴出来让我看看吗?它适用于我的任何几种情况。
  • 其实没关系,我通过将 Microsoft.Net.Compilers NuGet 包添加到我的项目来解决它。
猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
相关资源
最近更新 更多