使用C#中的关键字来声明变量内联

Ben*_*man 2 c# c#-6.0

我目前正在使用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#?

InB*_*een 8

此功能称为模式匹配,它是在版本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)

您可以在此处详细了解此功能.