使用is运算符时指定类型与var的区别及未赋值变量报错问题
两种模式匹配代码的差异解析
第一段代码报错的原因
第一段代码里的x is string o属于类型模式匹配:
- 只有当
x的实际类型是string时,变量o才会被赋值为x的强转结果 - 编译器做静态代码分析时,会覆盖所有可能的代码路径:如果
x不是string,o就完全没被初始化 - 哪怕你实际运行时
x是string,编译器也不会假设运行时状态,它会直接判定Console.WriteLine(o)存在“使用未赋值变量”的风险,因此抛出错误
第二段代码正常运行的逻辑
第二段代码的x is var o是var模式匹配:
- 这个模式的规则是无条件给
o赋值,不管x是什么类型,o都会被赋值为x本身 o的类型会被推断为x的编译时类型(这里是object),而且不管匹配结果result是true还是false,o都一定有值- 编译器能确定
o在所有代码路径都已初始化,所以不会报错
核心差异对比
类型 变量名模式:变量赋值依赖运行时匹配结果,属于条件性赋值,编译器严格检查赋值完整性var模式:变量总是被赋值为源对象,属于无条件赋值,编译器无需担心未初始化问题
内容的提问来源于stack exchange,提问作者Efe Belli
相关产品推荐
相关产品推荐

