更具体地说,为什么这样做:
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
返回的实体。
答案 0 :(得分:1)
我测试了您的代码示例(您在RIA域服务的Submit
覆盖中描述的完全相同的条件),两者都产生警告。
实际上是预期的:在这两种情况下,您都changeRow
声明为ChangeSetEntry
变量。它是否处于foreach
循环中并不会改变任何相关内容。由于RouteStage
不会从ChangeSetEntry
(已密封)继承,因此应始终显示警告。
要么你过分简化了你的例子(还有一些东西丢失了),要么就像Jon Skeet所怀疑的那样,两个代码片段中的RouteStage
类型实际上并没有引用相同的类型(检查你没有{{} 1}}你班上的某个地方。)
答案 1 :(得分:0)
该行应为:
if (changeRow.Entity is RouteStage)
......然后它干净利落地编译。其中一个“看不见”的案例。 TFS突出了我无意中改变的内容。
答案 2 :(得分:-1)
我可以理解,因为changeRow是一个ChangeSetEntry而不是 RouteStage,为什么它在foreach块中工作?
我不认为它在<{1}}循环中有效。唯一的区别似乎是编译器不对循环内的变量执行静态检查。因此,没有显示警告。但我认为执行永远不会在foreach
循环中传递if
,因为条件总是错误的。
这样做的方法就是删除两种形式的if语句,因为事先知道它永远不会是真的。