Поделиться через


Изменения в заметках ссылочного типа, допускающих значения NULL

В .NET 6 некоторые заметки о допустимости значений NULL в библиотеках .NET были изменены.

Описание изменения

В предыдущих версиях .NET некоторые заметки ссылочного типа, допускающие значения NULL, не верны, а предупреждения сборки либо отсутствуют, либо неверны. Начиная с .NET 6, были обновлены некоторые заметки, которые применялись ранее. Будут созданы новые предупреждения сборки, а неправильные предупреждения сборки для затронутых API больше не будут создаваться.

Некоторые из этих изменений считаются критическими, поскольку они могут привести к появлению новых предупреждений во время сборки. При переходе на .NET 6 необходимо обновить код, который ссылается на такие API.

Другие изменения, которые не считаются критическими, также описаны на этой странице. Любой код, ссылающийся на обновленные API, может стать эффективнее за счет удаления операторов или прагм, которые больше не нужны.

Представленные версии

6,0

Тип критического изменения

Это изменение может повлиять на совместимость исходного кода.

Причина изменения

Начиная с .NET Core 3.0, к библиотекам .NET были применены заметки о допустимости значений NULL. С самого начала ожидались ошибки в этих заметках. Благодаря отзывам и дальнейшему тестированию заметки, допускающие значение NULL для затрагиваемых API, были определены как неточные. В обновленных заметках правильно представлены контракты допустимости значений NULL для API.

Обновите код, в результате выполнения которого 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. Критическое

См. также