对可以为 Null 的引用类型注释的更改

在 .NET 6 中,.NET 库中的一些“为 Null 性”注释已更改。

更改描述

在以前的 .NET 版本中,一些可以为 Null 的引用类型注释不正确,并且生成警告要么缺失要么不正确。 从 .NET 6 开始,之前应用的一些注释已更新。 对于受影响的 API,将会生成新的生成警告,并且不再生成错误的生成警告。

其中的某些更改被视为“中断性”变更,因为它们可能会导致新的生成时警告。 迁移到 .NET 6 时,需要更新引用这些 API 的代码。

此页还介绍了其他不被视为中断性变更的更改。 任何引用已更新的 API 的代码都可从删除不再必要的运算符或 pragma 中受益。

引入的版本

6.0

中断性变更的类型

此项更改可能会影响源兼容性

更改原因

从 .NET Core 3.0 开始,已将“为 Null 性”注释应用于 .NET 库。 自这项工作伊始,已预料到这些注释中的错误。 通过反馈和进一步测试,已确定受影响 API 的“为 Null 性”注释是不准确的。 更新后的注释正确地表示了 API 的“为 Null 性”协定。

更新调用这些 API 的代码,以反映修订后的“为 Null 性”协定。

受影响的 API

下表列出了受影响的 API:

API 更改内容 中断性或非中断性
System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider.GetTypeDescriptor(Type, Object) instance 参数类型可以为 Null 非中断性
System.ComponentModel.ISite.Container 属性类型可以为 Null 重大
System.Xml.Linq.XContainer.Add(Object[]) 参数类型可以为 Null 非中断性
System.Xml.Linq.XContainer.AddFirst(Object[]) 参数类型可以为 Null 非中断性
System.Xml.Linq.XContainer.ReplaceNodes(Object[]) 参数类型可以为 Null 非中断性
XDocument(Object[]) 参数类型可以为 Null 非中断性
XDocument(XDeclaration, Object[]) 参数类型可以为 Null 非中断性
XElement(XName, Object[]) 第二个参数类型可以为 Null 非中断性
System.Xml.Linq.XElement.ReplaceAll(Object[]) 参数类型可以为 Null 非中断性
System.Xml.Linq.XElement.ReplaceAttributes(Object[]) 参数类型可以为 Null 非中断性
System.Xml.Linq.XNode.AddAfterSelf(Object[]) 参数类型可以为 Null 非中断性
System.Xml.Linq.XNode.AddBeforeSelf(Object[]) 参数类型可以为 Null 非中断性
System.Xml.Linq.XNode.ReplaceWith(Object[]) 参数类型可以为 Null 非中断性
XStreamingElement(XName, Object) 第二个参数类型可以为 Null 非中断性
XStreamingElement(XName, Object[]) 第二个参数类型可以为 Null 非中断性
System.Xml.Linq.XStreamingElement.Add(Object[]) 参数类型可以为 Null 非中断性
System.Xml.XmlDocument.XmlResolver 资源库接受可以为 null 的引用 重大
System.Net.Http.HttpClient.PatchAsync content 参数类型可以为 Null 非中断性
System.Net.Http.HttpClient.PostAsync content 参数类型可以为 Null 非中断性
System.Net.Http.HttpClient.PutAsync content 参数类型可以为 Null 非中断性
System.Linq.Expressions.MethodCallExpression.Update(Expression, IEnumerable<Expression>) 第一个参数类型可以为 Null 非中断性
System.Linq.Expressions.Expression<TDelegate>.Update(Expression, IEnumerable<ParameterExpression>) 返回类型不可以为 Null 非中断性
System.Data.IDataRecord.GetBytes(Int32, Int64, Byte[], Int32, Int32) buffer 参数类型可以为 Null 重大
System.Data.IDataRecord.GetChars(Int32, Int64, Char[], Int32, Int32) buffer 参数类型可以为 Null 重大
System.Data.Common.DbDataRecord.GetBytes(Int32, Int64, Byte[], Int32, Int32) buffer 参数类型可以为 Null 重大
System.Data.Common.DbDataRecord.GetChars(Int32, Int64, Char[], Int32, Int32) buffer 参数类型可以为 Null 重大
System.Net.HttpListenerContext.AcceptWebSocketAsync subProtocol 参数类型可以为 Null 非中断性
替代 System.Object.Equals(Object) 的方法和其他很多返回 bool 的方法 [NotNullWhen(true)] 已添加到第一个可为 null 的参数中 重大
System.Collections.Immutable.ImmutableArray<T>.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Collections.Specialized.BitVector32.Equals(Object) 已将 NotNullWhen(true) 添加至 o 参数 重大
System.Collections.Specialized.BitVector32.Section.Equals(Object) 已将 NotNullWhen(true) 添加至 o 参数 重大
System.Reflection.Metadata.BlobContentId.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.BlobHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.CustomDebugInformationHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.DocumentNameBlobHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.EntityHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.GuidHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.Handle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.ImportScopeHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.LocalConstantHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.NamespaceDefinitionHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.SequencePoint.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.SignatureHeader.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.Ecma335.EditAndContinueLogEntry.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Metadata.Ecma335.LabelHandle.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Emit.Label.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.Reflection.Emit.OpCode.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大
System.DateOnly.Equals(Object) 已将 NotNullWhen(true) 添加至 value 参数 重大
System.TimeOnly.Equals(Object) 已将 NotNullWhen(true) 添加至 value 参数 重大
System.Reflection.Pointer.Equals(Object) 已将 NotNullWhen(true) 添加至 obj 参数 重大

另请参阅