2014-01-02 8 views
8

Более конкретно, почему эта работа:Как работает ключевое слово «есть»?

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

, но это не?

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

В последнем случае я получаю предупреждение компилятора говоря:

Данное выражение никогда не предоставленного типа.

Я понимаю, что, как changeRow является ChangeSetEntry не RouteStage, так почему же он работает внутри foreach блока?

Это мое переопределение метода Submit в сервисе Domain Services службы RIA. RouteStage - это объект, который я определил для возврата DomainService.

+3

Это может быть предупреждение, потому что 'changeSet.ChangeSetEntries [0]' может быть аргументом за пределами исключения, тогда как 'foreach' просто не будет выполняться, если нет объектов, которые он собирает, поэтому' is' линия никогда не будет вызвана. – Tim

+0

Ответ находится в определении свойства 'ChangeSetEntries' –

+6

А вы уверены, что два блока кода относятся к тем же типам?Можете ли вы опубликовать краткую, но полную программу, демонстрирующую проблему? –

ответ

0

Линия следует читать:

if (changeRow.Entity is RouteStage) 

... то он компилируется. Один из таких случаев «не видит». TFS подчеркнула то, что я случайно изменил.

-1

Я понимаю, что, как changeRow является ChangeSetEntry не RouteStage, так почему это работает внутри блока Еогеасп?

Я не думаю, что он работает в foreach цикле. Единственное отличие состоит в том, что компилятор не выполняет статическую проверку переменных внутри цикла. Следовательно, предупреждение не отображается. Но я полагаю, что выполнение никогда не проходит if в цикле foreach, потому что условие всегда ложно.

Выход из этого только для того, чтобы удалить оператор if в обеих формах, поскольку заранее известно, что оно никогда не будет истинным.

+0

Выражение действительно оценивается как 'true' во время выполнения внутри блока foreach. Я столкнулся с предупреждением компилятора, когда попытался переместить чек вне блока foreach. –

1

Я проверил ваши примеры кода (в тех же условиях, которые вы описали, в переопределении службы домена RIA Submit) оба выдают предупреждение.

Это на самом деле ожидается: в обоих случаях у вас есть changeRow, который объявлен как переменная ChangeSetEntry. Независимо от того, находится ли он в цикле foreach или нет, это ничего не меняет. И поскольку RouteStage не наследует от ChangeSetEntry (который запечатан), предупреждение всегда должно отображаться.

Либо вы упрощать свой пример (и что-то отсутствует), или, как подозревал Джон Скит, то RouteStage типа в обоих фрагментов кода не на самом деле относятся к тому же типу (проверьте у вас нет using RouteStage = ChangeSetEntry; где-то в своем классе).

Смежные вопросы