模式匹配动态变量导致的编译器错误

雷克希诺

为什么将c != null && 结果添加到编译器错误 CS0165 中c1目标是.NET5.0。

var a = "";
if(a is string a1)
{
    if("".Contains(a1)) return; //OK
}
dynamic b = "";
if(b is string b1)
{
    if("".Contains(b1)) return; //OK
}

dynamic c = "";
if(c != null && c is string c1)
{
    if("".Contains(c1)) return; //CS0165 Using not assigned variable??
}

dynamic d = "";
if(d != null && d is string)
{
    var d1 = d;
    if("".Contains(d1)) return; //OK

    var d11 = d as string;
    if("".Contains(d11)) return; //OK
}

更新:
因此,根据 Luaan 的回答,不会评估整个语句,不仅是在动态对象的右侧

dynamic d = "";
var c = "";
if(c is string c1 && true && d != null && c is string f1)
{
    if("".Contains(c1)) return; //error
                
    if("".Contains(f1)) return; //error

    var d1 = d;
    if("".Contains(d1)) return; //OK
    var d11 = d as string;
    if("".Contains(d11)) return; //OK
}
六安

&& 不会在编译时对动态操作数短路。

根据规范(条件逻辑运算符):

如果条件逻辑运算符的操作数具有编译时类型 dynamic,则表达式是动态绑定的(动态绑定)。在这种情况下,表达式的编译时类型是动态的,下面描述的解析将在运行时使用那些具有编译时类型动态的操作数的运行时类型进行。

c != null && c is string c1是动态表达式,所以是动态绑定的,静态编译器不能保证c1被赋值。

当然,这在实践中并不重要,因为您的空检查完全是多余的 -is string已经确保该值不为空。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章