“是”关键字如何运作?

时间:2014-01-02 16:20:28

标签: c# wcf-ria-services

更具体地说,为什么这样做:

foreach (ChangeSetEntry changeRow in changeSet.ChangeSetEntries)
    if (changeRow is RouteStage)
    { ... }

但这不是吗?

ChangeSetEntry changeRow = changeSet.ChangeSetEntries[0];
if (changeRow is RouteStage)
{ ... }

在后一种情况下,我收到编译器警告说:

  

给定的表达式永远不是提供的类型。

我可以理解,由于changeRowChangeSetEntry而不是RouteStage,所以为什么它在foreach区块内有用?

这是我在RIA Services DomainService中覆盖Submit方法。 RouteStage是我已定义为由DomainService返回的实体。

3 个答案:

答案 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语句,因为事先知道它永远不会是真的。