c# - C#中使用is关键字声明变量内联

标签 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)

Visual Studio 2017 建议:

if (inputs.FirstOrDefault(i =>
        typeof(SoapAuthBase).IsAssignableFrom(i.GetType())) 
        is SoapAuthBase authenticationContract)

我查看了 Microsoft 关于 'is' keyword 的文档并没有发现任何可以解释这种语法的东西。

以这种方式“添加”了哪个版本的 C#?

最佳答案

此功能称为模式匹配,它是在版本 7 的 c# 语言中引入的。在您的示例中它不是很清楚,但请考虑以下 Equals 的规范示例> 覆盖:

public override bool Equals(obj other)
{
    if (obj is Foo)
    {
        return Equals((Foo)obj);
    }

    return false;
}

这实际上是一种浪费,因为您要检查类型两次:一次是查看它是否实际上是一个 Foo,然后在执行转换时再次检查。这似乎不必要地冗长。

模式匹配允许更简洁的语法:

public override bool Equals(obj other)
{
    if (obj is Foo foo)
    {
        return Equals(foo);
    }

    return false;
}

您可以阅读有关此功能的更多信息 here .

关于c# - C#中使用is关键字声明变量内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49365744/

相关文章:

c# - 嵌套日期范围查询过滤器 ElasticSearch NEST C#

c# - 更新实体错误 : A second operation started on this context before a previous operation completed

c# - 从 Visual Studio 2015 中的代码覆盖率中排除自动属性

c# - 如何在 C# 6.0 字符串插值中输入引号字符

c# - 如何在C#中添加第三方库?

asp.net-core - 在 Visual Studio CTP2 的 ASP.VNext 项目中启用 C# 6

c# - UPS API - LabelLinksIndicator - 未设置对象实例的对象引用

c# - WebGrid Helper 分页不适用于 .NET 4.5 MVC 4

c# - 在 C# 中,我可以让自动属性在属性的帮助下执行一些额外的工作吗?

dapper - Dapper 是否支持 POCO 中的 c#6 只读属性?