关于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(); }
这个语法的核心是类型模式匹配,它一次性完成了三件事:
- 执行
inputs.FirstOrDefault(...)获取集合中匹配类型的第一个实例(或null) - 判断该实例是否属于
SoapAuthenticationBase类型(包括其子类,和你原代码的IsAssignableFrom逻辑完全一致) - 如果判断为真,自动将实例赋值给
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
相关产品推荐
相关产品推荐

