2015-09-17 2 views
0

dbLinq XMlMappingSource.cs содержит код:Как исправить недостижимый код dedected предупреждение

public void ReadEmptyContent(XmlReader r, string name) 
    { 
     if (r.IsEmptyElement) 
      r.ReadStartElement(name, DbmlNamespace); 
     else 
     { 
      r.ReadStartElement(name, DbmlNamespace); 
      for (r.MoveToContent(); r.NodeType != XmlNodeType.EndElement; r.MoveToContent()) 
      { 
       if (r.NamespaceURI != DbmlNamespace) 
        r.Skip(); 
       throw UnexpectedItemError(r); 
      } 
      r.ReadEndElement(); 
     } 
    } 

Это вызывает обобщит предупреждение

Предупреждение CS0162 Недоступен код обнаружен

на линии

  for (r.MoveToContent(); r.NodeType != XmlNodeType.EndElement; r.MoveToContent()) 

(https://github.com/DbLinq/dblinq2007/blob/d7a05bb452b98fd24bca5693da01ecfecd4f3d40/src/DbLinq/Data/Linq/Mapping/XmlMappingSource.cs#L176)

в третьей части пункта for r.MoveToContent() Похоже, что нормальный код обхода узла и третья часть for достигнута.

Как это исправить? Использование .NET 4

+0

'r.ReadEndElement();' недостижимо, потому что вы выбрасываете прямое исключение как 'throw UnexpectedItemError (r);' –

+0

У вас есть два оператора if без фигурных скобок. Те должны всегда быть красным флагом для вас, так как распространенная ошибка - злоупотреблять ими. Я предлагаю всегда использовать фигурные скобки, даже для отдельных операторов в блоке кода. – mason

+0

Кстати, вы можете игнорировать оператор else, поскольку вы всегда выполняете 'r.ReadStartElement (name, DbmlNamespace);' –

ответ

0

Как сказал Ролинг, вы бросаете исключение, несмотря ни на что.

Попробуйте изменить цикл к этому:

for (r.MoveToContent(); r.NodeType != XmlNodeType.EndElement; r.MoveToContent()) 
      { 
       if (r.NamespaceURI != DbmlNamespace) 
        r.Skip(); 
       else 
        throw UnexpectedItemError(r); 
      } 

Это позволит устранить проблему.

2

Вы никогда не выполняете шаг приращения, потому что ваш первый прогон в цикле всегда вызывает исключение.