Mic*_* II 2 c# pattern-matching c#-7.0
我在这里缺少什么
Visual Studio告诉我使用内联模式匹配并为我重写代码但是当它发生时我得到错误:
严重级代码描述项目文件行抑制状态错误CS8121类型为TReturnState的表达式不能由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);
}
Run Code Online (Sandbox Code Playgroud)
这是VS为我重做它时的样子.
public override void UpdateState<TReturnState>(TReturnState returnState)
{
if (returnState is LightState newState)
State = newState;
base.UpdateState(returnState);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢调整后的方式,但我收到错误.我错过了什么或这是一个错误吗?
我正在使用的包:
"dependencies": {
"Microsoft.NETCore.UniversalWindowsPlatform": "5.3.1",
"Newtonsoft.Json": "9.0.1",
"System.ValueTuple": "4.3.0"
},
Run Code Online (Sandbox Code Playgroud)
正如@SirRufo在评论中指出的那样,它似乎是C#7中的已知错误.
解决方法是使用强制转换将代码写入对象.
public override void UpdateState<TReturnState>(TReturnState returnState)
{
if ((object)returnState is SpeakerState newState)
State = newState;
base.UpdateState(returnState);
}
Run Code Online (Sandbox Code Playgroud)
然而; 这不是一个真正的修复,而是一个克服错误的黑客.Visual Studio还告诉我,这个转换为对象是不必要的,并尝试修复它,但是当它发生时,我再次得到错误.
这通过Visual Studio对整个代码重构进行了抑制.
编辑:升级到C#7.1修复了这个问题的拳击匹配匿名类型的问题,它现在的工作就像它应该没有开销.