C# 7 使用模式匹配不起作用

C# 7 Use Pattern Matching not working

我在这里错过了什么。

Visual Studio 告诉我使用内联模式匹配并为我重写代码但是当它这样做时我得到错误:

Severity Code Description Project File Line Suppression State Error CS8121 An expression of type TReturnState cannot be handled by a pattern of type LightState. DataModels C:\Users\Michael\Documents\windows\GCMS UWP\Models\Models\Elements\Lights\Light.cs 77 Active

原代码如下:

    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"
  },

正如@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 修复了模式匹配匿名类型的装箱问题,它现在可以像预期的那样工作而没有开销。