编译器的变化?

Changes in compiler?

对于曾经在Visual Studio 2017上工作的项目VB.Net,我升级到Visual Studio 2019,两个版本仍然使用.Net 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.

我在 release notes.

中找不到任何相关信息

这个问题当然可以通过将其更改为来解决:

Dim highUId As Integer = alarmNw.Descendants().Where(Function(y) y.Attribute("UId") IsNot Nothing).ToList() _
                    .Max(Function(x) Convert.ToInt32(x.Attribute("UId").Value))

如果这个改变了还有什么改变?是否有预期会出现哪些类型问题的列表?

我尝试在 VS2017 和 VS2019 中都使用框架 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 中都得到了一个空引用,所以我怀疑其他地方发生了变化。