C#中该语法为何有效?WPF里is关键字后变量的作用
解答你的C#语法疑问
1. 为何这个C#语法是有效的?
这个if (parameter is IHavePassword passwordContainer)语法是C# 7.0及更高版本官方支持的类型模式匹配特性,属于语言规范里的正式语法,所以完全有效。微软引入这个特性是为了简化类型检查与转换的代码,让逻辑更简洁可读。
2. is关键字后部分的作用是什么?
你完全想错啦——这可不是把参数和IHavePassword的新实例做比较!这句话其实一次性完成了两个关键操作:
- 类型检查:判断
parameter是否可以安全转换为IHavePassword类型(比如参数本身是该接口的实现类实例,或者能隐式转成这个类型); - 赋值变量:如果检查通过,自动把
parameter转换为IHavePassword类型,并赋值给passwordContainer变量,你直接就能在if代码块里用这个变量,不用再手动强制转换或者写as+空判断。
举个新旧写法的对比,你就懂它有多方便了:
旧写法(C# 7.0之前)
private void DoLogin(object parameter) { // 先尝试转换,再判断是否为空 IHavePassword passwordContainer = parameter as IHavePassword; if (passwordContainer != null) { // 在这里使用转换后的变量 } }
新写法(当前语法)
private void DoLogin(object parameter) { // 检查+转换+赋值一步到位 if (parameter is IHavePassword passwordContainer) { // 直接用passwordContainer,无需额外转换 } }
还有个细节要提:passwordContainer这个变量的作用域只在if的代码块里,出了这个块就不能用了——这是特意设计的,确保只有类型检查通过时才能访问它,从根源上避免了空引用的风险。
内容的提问来源于stack exchange,提问作者turingcomplete




