如何将is运算符的声明模式与三元运算符结合使用?
错误原因说明
- 模式匹配声明的变量
y,其作用域仅覆盖编译器能确定该变量已被成功赋值的代码区域。你的代码中,三元运算符的:分支对应a is (int?) y为false的场景——此时y从未被赋值,编译器判定该变量在这个分支中不存在,因此抛出「y在当前上下文不存在」的错误。 - 同时你的逻辑存在矛盾:当
a为null(匹配失败)时,你试图调用y.ToString(),但此时y根本没有被初始化,逻辑上不成立。
正确实现方法
根据不同需求场景,给出两种可行实现:
场景1:当a有值时返回y的字符串形式,无值时返回固定文本
int? a = null; var b = a is int? y ? y.ToString() : "bla bla bla";
这里a is int? y匹配成功时(a不为null),y已被赋值为a的有效值,可安全调用ToString();匹配失败时直接返回固定字符串,无需使用y。
场景2:当a有值时返回固定文本,无值时返回null相关提示
int? a = null; var b = a is int? y ? "bla bla bla" : "a is null";
如果需要进一步处理a为null的逻辑,直接在:分支编写对应代码即可,不要引用未初始化的y。
另外,由于a本身就是int?类型,可简化模式匹配的写法:
- 如果需要
y为int类型(自动拆箱),可写成a is int y - 如果需要
y保留int?类型,写成a is int? y即可,无需额外加括号
内容的提问来源于stack exchange,提问作者D G
相关产品推荐
相关产品推荐

