You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C#中is关键字内联声明变量的用法疑问及VS代码建议咨询

关于C#中is关键字带变量的用法解析

你遇到的这个是C# 7.0及以上版本引入的类型模式匹配语法,VS2017建议的写法是把「查找实例→类型检查→变量赋值」三个步骤合并成了更简洁的单一步骤,咱们来拆解下:

原代码的冗余点

你的原代码逻辑是:

var authInfo = inputs.FirstOrDefault(i => typeof(SoapAuthenticationBase).IsAssignableFrom(i.GetType()));
if (authInfo is SoapAuthenticationBase)
{
    // 这里如果要调用SoapAuthenticationBase的成员,还得额外强制转换:((SoapAuthenticationBase)authInfo).SomeMethod();
}

这里有两个明显的冗余:

  • 先声明的authInfo变量类型是宽泛的object(假设inputs是IEnumerable<object>),后续使用时必须手动强制转换才能访问目标类型的成员
  • 类型检查和变量声明分离,代码显得繁琐重复

VS推荐写法的核心优势

VS建议的完整写法应该是这样的:

if (inputs.FirstOrDefault(i => typeof(SoapAuthenticationBase).IsAssignableFrom(i.GetType())) is SoapAuthenticationBase authInfo)
{
    // 直接使用authInfo,它已经是SoapAuthenticationBase类型,无需任何转换
    authInfo.ValidateCredentials();
}

这个语法的核心是类型模式匹配,它一次性完成了三件事:

  1. 执行inputs.FirstOrDefault(...)获取集合中匹配类型的第一个实例(或null)
  2. 判断该实例是否属于SoapAuthenticationBase类型(包括其子类,和你原代码的IsAssignableFrom逻辑完全一致)
  3. 如果判断为真,自动将实例赋值给authInfo变量,这个变量可以直接在if的代码块内使用

兼容性说明

虽然你的项目目标框架是.NET Framework 4.6.2,但C#语言版本和.NET框架版本是相对独立的——只要在VS2017中把项目的C#语言版本设置为7.0或更高(比如7.3),就能使用这个语法:

  • 右键项目 → 属性 → 生成 → 高级 → 语言版本,选择对应版本即可

额外细节补充

  • 如果FirstOrDefault返回null,is SoapAuthenticationBase authInfo的判断结果会是false,authInfo不会被赋值,代码块也不会执行
  • 这种写法不仅精简了代码,还避免了手动强制转换可能带来的类型错误,让代码的可读性和安全性都有所提升

内容的提问来源于stack exchange,提问作者Ben Hoffman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:17:15