Cambios en las anotaciones de tipos de referencia que aceptan valores NULL

En .NET 6, algunas anotaciones de nulabilidad de las bibliotecas de .NET han cambiado.

Descripción del cambio

En versiones anteriores de .NET, algunas anotaciones de tipos de referencia que aceptan valores NULL son incorrectas y las advertencias de compilación están ausentes o son incorrectas. A partir de .NET 6, se han actualizado algunas anotaciones aplicadas previamente. Se generarán nuevas advertencias de compilación y ya no se producirán advertencias de compilación incorrectas para las API afectadas.

Algunos de estos cambios se consideran importantes, ya que pueden dar lugar a nuevas advertencias en tiempo de compilación. Al realizar la migración a .NET 6, será necesario actualizar el código que hace referencia a estas API.

En esta página también se documentan otros cambios que no se consideran importantes. Cualquier código que haga referencia a las API actualizadas se puede beneficiar de la eliminación de operadores o pragmas que ya no sean necesarios.

Versión introducida

6.0

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad de orígenes.

Motivo del cambio

A partir de .NET Core 3.0, se han aplicado anotaciones de nulabilidad a las bibliotecas de .NET. Desde el principio del esfuerzo, se esperaban errores en estas anotaciones. Gracias a comentarios y pruebas adicionales, se ha determinado que las anotaciones que aceptan valores NULL de las API afectadas eran inexactas. Las anotaciones actualizadas representan correctamente los contratos de nulabilidad de las API.

Actualice el código que llama a estas API para reflejar los contratos de nulabilidad revisados.

API afectadas

En la tabla siguiente se enumeran las API afectadas:

API Qué cambia Importante o no importante
System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider.GetTypeDescriptor(Type, Object) Tipo de parámetro instance que admite un valor NULL No importante
System.ComponentModel.ISite.Container Tipo de propiedad que admite un valor NULL Problemático
System.Xml.Linq.XContainer.Add(Object[]) Tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XContainer.AddFirst(Object[]) Tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XContainer.ReplaceNodes(Object[]) Tipo de parámetro que admite un valor NULL No importante
XDocument(Object[]) Tipo de parámetro que admite un valor NULL No importante
XDocument(XDeclaration, Object[]) Tipo de parámetro que admite un valor NULL No importante
XElement(XName, Object[]) Segundo tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XElement.ReplaceAll(Object[]) Tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XElement.ReplaceAttributes(Object[]) Tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XNode.AddAfterSelf(Object[]) Tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XNode.AddBeforeSelf(Object[]) Tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XNode.ReplaceWith(Object[]) Tipo de parámetro que admite un valor NULL No importante
XStreamingElement(XName, Object) Segundo tipo de parámetro que admite un valor NULL No importante
XStreamingElement(XName, Object[]) Segundo tipo de parámetro que admite un valor NULL No importante
System.Xml.Linq.XStreamingElement.Add(Object[]) Tipo de parámetro que admite un valor NULL No importante
System.Xml.XmlDocument.XmlResolver El establecedor acepta una referencia nula Problemático
System.Net.Http.HttpClient.PatchAsync Tipo de parámetro content que admite un valor NULL No importante
System.Net.Http.HttpClient.PostAsync Tipo de parámetro content que admite un valor NULL No importante
System.Net.Http.HttpClient.PutAsync Tipo de parámetro content que admite un valor NULL No importante
System.Linq.Expressions.MethodCallExpression.Update(Expression, IEnumerable<Expression>) Primer tipo de parámetro que admite un valor NULL No importante
System.Linq.Expressions.Expression<TDelegate>.Update(Expression, IEnumerable<ParameterExpression>) Tipo de valor devuelto que no acepta un valor NULL No importante
System.Data.IDataRecord.GetBytes(Int32, Int64, Byte[], Int32, Int32) Tipo de parámetro buffer que admite un valor NULL Problemático
System.Data.IDataRecord.GetChars(Int32, Int64, Char[], Int32, Int32) Tipo de parámetro buffer que admite un valor NULL Problemático
System.Data.Common.DbDataRecord.GetBytes(Int32, Int64, Byte[], Int32, Int32) Tipo de parámetro buffer que admite un valor NULL Problemático
System.Data.Common.DbDataRecord.GetChars(Int32, Int64, Char[], Int32, Int32) Tipo de parámetro buffer que admite un valor NULL Problemático
System.Net.HttpListenerContext.AcceptWebSocketAsync Tipo de parámetro subProtocol que admite un valor NULL No importante
Métodos que invalidan System.Object.Equals(Object) y muchos otros que devuelven bool [NotNullWhen(true)] agregado al primer parámetro que admite un valor NULL Problemático
System.Collections.Immutable.ImmutableArray<T>.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Collections.Specialized.BitVector32.Equals(Object) NotNullWhen(true) se agregó al parámetro o Problemático
System.Collections.Specialized.BitVector32.Section.Equals(Object) NotNullWhen(true) se agregó al parámetro o Problemático
System.Reflection.Metadata.BlobContentId.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.BlobHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.CustomDebugInformationHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.DocumentNameBlobHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.EntityHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.GuidHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.Handle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.ImportScopeHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.LocalConstantHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.NamespaceDefinitionHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.SequencePoint.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.SignatureHeader.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.Ecma335.EditAndContinueLogEntry.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Metadata.Ecma335.LabelHandle.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Emit.Label.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.Reflection.Emit.OpCode.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático
System.DateOnly.Equals(Object) NotNullWhen(true) se agregó al parámetro value Problemático
System.TimeOnly.Equals(Object) NotNullWhen(true) se agregó al parámetro value Problemático
System.Reflection.Pointer.Equals(Object) NotNullWhen(true) se agregó al parámetro obj Problemático

Vea también