#vb.net #visual-studio-2019
#vb.net #visual-studio-2019
Вопрос:
Для проекта VB.Net
, над которым я работал Visual Studio 2017
, я обновился до Visual Studio 2019
, до сих пор используются обе версии .Сетевая версия 4.5.1.
Некоторый код, который раньше нормально работал в VS2017, но в VS2019
нем выдает исключение:
Dim highUId As Integer = alarmNw.Descendants().Max(Function(x) Convert.ToInt32(x.Attribute("UId").Value))
Где alarmNw
находится xElement
объект, который содержит кучу потомков, некоторые из которых имеют UId
атрибут, некоторые нет. Значение атрибута UId всегда является целочисленным значением.
Макет версии данных может быть сгенерирован с:
Dim alarmNw As XElement = New XElement("Main", New XElement("Sub1", New XAttribute("UId", 1)), New XElement("Sub2"))
Сообщение об ошибке: Reference not set to instance of an object.
Я ничего не могу найти об этом в примечаниях к выпуску.
Конечно, эту проблему можно исправить, изменив ее на:
Dim highUId As Integer = alarmNw.Descendants().Where(Function(y) y.Attribute("UId") IsNot Nothing).ToList() _
.Max(Function(x) Convert.ToInt32(x.Attribute("UId").Value))
Если это изменилось, что еще изменилось? Есть ли список типов проблем, которые следует ожидать?
Комментарии:
1. Возможно ли, что alarmNw содержит разные данные?
2. @the_lotus Нет, я тестировал точно на тех же исходных данных.
3. Что это за сообщение об исключении? (PS вероятно, это не имеет к этому никакого отношения, но не забудьте установить параметр Strict On по умолчанию для новых проектов, поскольку этот параметр, похоже, не переносится.)
4. если x.Attribute(«UId») или x.Attribute(«UId»). Значение было null для любой из записей, это не должно было работать в первую очередь
5. @DrDonut Если он использует параметр Strict Off, то, к сожалению, он может делать все, что пожелает. В этом случае всегда следует ожидать проблем.
Ответ №1:
Я пытался воспроизвести это как в VS2017, так и в VS2019, используя framework 4.5.1
Код, который я запустил,
Sub Main()
Dim alarmNw As XElement = New XElement("Main", New XElement("Sub1", New XAttribute("UId", 1)), New XElement("Sub2"))
Dim highUId As Integer = alarmNw.Descendants().Max(Function(x) Convert.ToInt32(x.Attribute("UId").Value))
Console.WriteLine(highUId)
Console.Read()
End Sub
Я получаю нулевую ссылку в обеих IDE, поэтому я подозреваю, что что-то еще изменилось.
Комментарии:
1. Пожалуйста, не используйте строковые литералы для XML в VB. В VB есть XML-литералы.
Dim alarmNw = <a><b UId="1"/><b UId="2"/><b/><b UId="3"/></a>
.2. @GSerg я обновил свой ответ, чтобы отразить код в вопросе.
3. Спасибо! Есть какие-нибудь подсказки, что это может быть за другая вещь? Это было также на новой виртуальной машине, но с тем же установленным программным обеспечением…
4. @DrDonut. Я не уверен, что изменилось, но если вы не используете .value и вместо этого используете CStr(), вы можете получить это не ошибка.
Dim highUId As Integer = alarmNw.Descendants().Max(Function(x) Convert.ToInt32(CStr(x.Attribute("UId"))))
Хотя это не совсем хороший код