为何VB中的AND语句编译后会变为C#的&运算符?
VB.NET的
And运算符为何被反编译为C#的&而非&&? 原VB.NET代码
If IsDataProperty(p) And (p.Name.StartsWith("ref_") = False) Then ... End If
反编译得到的C#代码
if (this.IsDataProperty(p) & !p.Name.StartsWith("ref_")) { ... }
你疑惑的点在于:如果IsDataProperty(p)为false,整个表达式结果已经是false,为什么不编译成短路逻辑与的&&?
原因很简单:VB.NET的And运算符本身就是非短路的逻辑与,它的行为是不管左侧表达式的结果是什么,右侧表达式都会被执行。而C#里的&(当操作数是bool类型时)就是对应的非短路逻辑与,和VB的And行为完全一致。
如果你的VB代码原本想使用短路逻辑与(即左侧为false时跳过右侧执行),那应该用VB.NET的AndAlso运算符,对应的C#代码才会是&&。比如:
If IsDataProperty(p) AndAlso (p.Name.StartsWith("ref_") = False) Then ... End If
这段代码反编译后就会得到你预期的:
if (this.IsDataProperty(p) && !p.Name.StartsWith("ref_")) { ... }
内容的提问来源于stack exchange,提问作者AngryHacker
相关产品推荐
相关产品推荐

