[英]How does the “is” keyword work?
更具体地说,为什么这样做:
foreach (ChangeSetEntry changeRow in changeSet.ChangeSetEntries)
if (changeRow is RouteStage)
{ ... }
但这不是吗?
ChangeSetEntry changeRow = changeSet.ChangeSetEntries[0];
if (changeRow is RouteStage)
{ ... }
在后一种情况下,我得到一个编译器警告,说:
给定的表达式绝不是提供的类型。
我可以理解,因为changeRow
是一个ChangeSetEntry
而不是RouteStage
,那么为什么它在foreach
块中起作用?
这是我对RIA Services DomainService中的Submit
方法的重写。 RouteStage
是我定义为由DomainService
返回的DomainService
。
我测试了您的代码示例(与RIA域服务的Submit
覆盖中所述的条件完全相同),两者均产生警告。
实际上是可以预期的:在两种情况下,您都具有声明为ChangeSetEntry
变量的changeRow
。 无论它是否处于foreach
循环中,都不会对此进行任何更改。 由于RouteStage
不继承自ChangeSetEntry
(已密封),因此应始终显示警告。
要么您简化了示例(缺少某些内容),要么正如乔恩·斯基特(Jon Skeet)怀疑的RouteStage
,两个代码段中的RouteStage
类型实际上并未引用相同的类型(检查您是否没有using RouteStage = ChangeSetEntry;
您在类中的某个位置) )。
该行应显示为:
if (changeRow.Entity is RouteStage)
...然后干净地编译。 其中一种情况是“看不到外观”。 TFS强调了我无意中更改的内容。
我可以理解,因为changeRow是一个ChangeSetEntry而不是RouteStage,那么为什么它在foreach块中起作用?
我不认为它在foreach
循环。 唯一的区别似乎是编译器不对循环内的变量执行静态检查。 因此,不会显示警告。 但是我想if
在foreach
循环内执行永远不会过去if
因为条件始终为假。
解决方法只是删除两种形式的if语句,因为事先知道它永远都不是真的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.