我目前正在使用v4.6.2开发一个C#项目,Visual Studio刚刚建议对下面的代码进行代码更改.
我的问题是,我从未见过is用于以这种方式创建新变量实例的关键字.
原始代码是:
var authInfo = inputs.FirstOrDefault(i =>
typeof(SoapAuthenticationBase).IsAssignableFrom(i.GetType()));
if (authInfo is SoapAuthenticationBase)
Run Code Online (Sandbox Code Playgroud)
Visual Studio 2017建议:
if (inputs.FirstOrDefault(i =>
typeof(SoapAuthBase).IsAssignableFrom(i.GetType()))
is SoapAuthBase authenticationContract)
Run Code Online (Sandbox Code Playgroud)
我在'is'关键字上检查了Microsoft的文档,但没有发现任何解释这种语法的内容.
以这种方式添加了什么版本的C#?
此功能称为模式匹配,它是在版本7的c#语言中引入的.在您的示例中它不是很清楚,但请考虑以下Equals覆盖的规范示例:
public override bool Equals(obj other)
{
if (obj is Foo)
{
return Equals((Foo)obj);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这实际上是浪费,因为你要检查两次类型:一次查看它实际上是否为a Foo,然后再执行转换时再次检查.这似乎不必要地冗长.
模式匹配允许更简洁的语法:
public override bool Equals(obj other)
{
if (obj is Foo foo)
{
return Equals(foo);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处详细了解此功能.