Annotate System.Net.WebHeaderCollection for nullable (dotnet/corefx#41665)
authorbuyaa-n <bunamnan@microsoft.com>
Fri, 11 Oct 2019 20:13:07 +0000 (13:13 -0700)
committerGitHub <noreply@github.com>
Fri, 11 Oct 2019 20:13:07 +0000 (13:13 -0700)
* Annotate System.Net.WebHeaderCollection for nullable

Commit migrated from https://github.com/dotnet/corefx/commit/37f55779b13962c369933ecd5be97beb032d4d78

src/libraries/Common/src/System/Net/CaseInsensitiveAscii.cs
src/libraries/Common/src/System/Net/HttpValidationHelpers.cs
src/libraries/Common/src/System/Net/Logging/NetEventSource.Common.cs
src/libraries/System.Net.WebHeaderCollection/ref/System.Net.WebHeaderCollection.cs
src/libraries/System.Net.WebHeaderCollection/ref/System.Net.WebHeaderCollection.csproj
src/libraries/System.Net.WebHeaderCollection/src/System.Net.WebHeaderCollection.csproj
src/libraries/System.Net.WebHeaderCollection/src/System/Net/HeaderInfoTable.cs
src/libraries/System.Net.WebHeaderCollection/src/System/Net/WebHeaderCollection.cs

index 7d97cdb..540b79e 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Collections;
 
 namespace System.Net
@@ -42,7 +43,7 @@ namespace System.Net
         // ASCII string case insensitive hash function
         public int GetHashCode(object myObject)
         {
-            string myString = myObject as string;
+            string? myString = myObject as string;
             if (myString == null)
             {
                 return 0;
@@ -57,10 +58,10 @@ namespace System.Net
         }
 
         // ASCII string case insensitive comparer
-        public int Compare(object firstObject, object secondObject)
+        public int Compare(object? firstObject, object? secondObject)
         {
-            string firstString = firstObject as string;
-            string secondString = secondObject as string;
+            string? firstString = firstObject as string;
+            string? secondString = secondObject as string;
             if (firstString == null)
             {
                 return secondString == null ? 0 : -1;
@@ -97,10 +98,10 @@ namespace System.Net
         }
 
         // ASCII string case insensitive comparer
-        public new bool Equals(object firstObject, object secondObject)
+        public new bool Equals(object? firstObject, object? secondObject)
         {
-            string firstString = firstObject as string;
-            string secondString = secondObject as string;
+            string? firstString = firstObject as string;
+            string? secondString = secondObject as string;
             if (firstString == null)
             {
                 return secondString == null;
index b486051..d31041f 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 namespace System.Net
 {
     internal static class HttpValidationHelpers
@@ -46,7 +47,7 @@ namespace System.Net
         /// <summary>
         /// Throws on invalid header value chars.
         /// </summary>
-        public static string CheckBadHeaderValueChars(string value)
+        public static string CheckBadHeaderValueChars(string? value)
         {
             if (string.IsNullOrEmpty(value))
             {
index bd2ca6a..69dc680 100644 (file)
@@ -8,6 +8,7 @@
 //#define DEBUG_NETEVENTSOURCE_MISUSE
 #endif
 
+#nullable enable
 using System.Collections;
 using System.Diagnostics;
 using System.Diagnostics.Tracing;
@@ -99,7 +100,7 @@ namespace System.Net
         /// <param name="formattableString">A description of the entrance, including any arguments to the call.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Enter(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null)
+        public static void Enter(object thisOrContextObject, FormattableString? formattableString = null, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(formattableString);
@@ -111,7 +112,7 @@ namespace System.Net
         /// <param name="arg0">The object to log.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Enter(object thisOrContextObject, object arg0, [CallerMemberName] string memberName = null)
+        public static void Enter(object thisOrContextObject, object arg0, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(arg0);
@@ -124,7 +125,7 @@ namespace System.Net
         /// <param name="arg1">The second object to log.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Enter(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string memberName = null)
+        public static void Enter(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(arg0);
@@ -139,7 +140,7 @@ namespace System.Net
         /// <param name="arg2">The third object to log.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Enter(object thisOrContextObject, object arg0, object arg1, object arg2, [CallerMemberName] string memberName = null)
+        public static void Enter(object thisOrContextObject, object arg0, object arg1, object arg2, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(arg0);
@@ -149,7 +150,7 @@ namespace System.Net
         }
 
         [Event(EnterEventId, Level = EventLevel.Informational, Keywords = Keywords.EnterExit)]
-        private void Enter(string thisOrContextObject, string memberName, string parameters) =>
+        private void Enter(string thisOrContextObject, string? memberName, string parameters) =>
             WriteEvent(EnterEventId, thisOrContextObject, memberName ?? MissingMember, parameters);
         #endregion
 
@@ -159,7 +160,7 @@ namespace System.Net
         /// <param name="formattableString">A description of the exit operation, including any return values.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Exit(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null)
+        public static void Exit(object thisOrContextObject, FormattableString? formattableString = null, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(formattableString);
@@ -171,7 +172,7 @@ namespace System.Net
         /// <param name="arg0">A return value from the member.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Exit(object thisOrContextObject, object arg0, [CallerMemberName] string memberName = null)
+        public static void Exit(object thisOrContextObject, object arg0, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(arg0);
@@ -184,7 +185,7 @@ namespace System.Net
         /// <param name="arg1">A second return value from the member.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Exit(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string memberName = null)
+        public static void Exit(object thisOrContextObject, object arg0, object arg1, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(arg0);
@@ -193,7 +194,7 @@ namespace System.Net
         }
 
         [Event(ExitEventId, Level = EventLevel.Informational, Keywords = Keywords.EnterExit)]
-        private void Exit(string thisOrContextObject, string memberName, string result) =>
+        private void Exit(string thisOrContextObject, string? memberName, string? result) =>
             WriteEvent(ExitEventId, thisOrContextObject, memberName ?? MissingMember, result);
         #endregion
 
@@ -203,7 +204,7 @@ namespace System.Net
         /// <param name="formattableString">The message to be logged.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Info(object thisOrContextObject, FormattableString formattableString = null, [CallerMemberName] string memberName = null)
+        public static void Info(object thisOrContextObject, FormattableString? formattableString = null, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(formattableString);
@@ -215,7 +216,7 @@ namespace System.Net
         /// <param name="message">The message to be logged.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Info(object thisOrContextObject, object message, [CallerMemberName] string memberName = null)
+        public static void Info(object thisOrContextObject, object message, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(message);
@@ -223,7 +224,7 @@ namespace System.Net
         }
 
         [Event(InfoEventId, Level = EventLevel.Informational, Keywords = Keywords.Default)]
-        private void Info(string thisOrContextObject, string memberName, string message) =>
+        private void Info(string thisOrContextObject, string? memberName, string? message) =>
             WriteEvent(InfoEventId, thisOrContextObject, memberName ?? MissingMember, message);
         #endregion
 
@@ -233,7 +234,7 @@ namespace System.Net
         /// <param name="formattableString">The message to be logged.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName = null)
+        public static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(formattableString);
@@ -245,7 +246,7 @@ namespace System.Net
         /// <param name="message">The message to be logged.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Error(object thisOrContextObject, object message, [CallerMemberName] string memberName = null)
+        public static void Error(object thisOrContextObject, object message, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(message);
@@ -253,7 +254,7 @@ namespace System.Net
         }
 
         [Event(ErrorEventId, Level = EventLevel.Warning, Keywords = Keywords.Default)]
-        private void ErrorMessage(string thisOrContextObject, string memberName, string message) =>
+        private void ErrorMessage(string thisOrContextObject, string? memberName, string? message) =>
             WriteEvent(ErrorEventId, thisOrContextObject, memberName ?? MissingMember, message);
         #endregion
 
@@ -263,7 +264,7 @@ namespace System.Net
         /// <param name="formattableString">The message to be logged.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Fail(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName = null)
+        public static void Fail(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string? memberName = null)
         {
             // Don't call DebugValidateArg on args, as we expect Fail to be used in assert/failure situations
             // that should never happen in production, and thus we don't care about extra costs.
@@ -277,7 +278,7 @@ namespace System.Net
         /// <param name="message">The message to be logged.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Fail(object thisOrContextObject, object message, [CallerMemberName] string memberName = null)
+        public static void Fail(object thisOrContextObject, object message, [CallerMemberName] string? memberName = null)
         {
             // Don't call DebugValidateArg on args, as we expect Fail to be used in assert/failure situations
             // that should never happen in production, and thus we don't care about extra costs.
@@ -287,7 +288,7 @@ namespace System.Net
         }
 
         [Event(CriticalFailureEventId, Level = EventLevel.Critical, Keywords = Keywords.Debug)]
-        private void CriticalFailure(string thisOrContextObject, string memberName, string message) =>
+        private void CriticalFailure(string thisOrContextObject, string? memberName, string? message) =>
             WriteEvent(CriticalFailureEventId, thisOrContextObject, memberName ?? MissingMember, message);
         #endregion
 
@@ -297,7 +298,7 @@ namespace System.Net
         /// <param name="buffer">The buffer to be logged.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void DumpBuffer(object thisOrContextObject, byte[] buffer, [CallerMemberName] string memberName = null)
+        public static void DumpBuffer(object thisOrContextObject, byte[] buffer, [CallerMemberName] string? memberName = null)
         {
             DumpBuffer(thisOrContextObject, buffer, 0, buffer.Length, memberName);
         }
@@ -309,7 +310,7 @@ namespace System.Net
         /// <param name="count">The number of bytes to log.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void DumpBuffer(object thisOrContextObject, byte[] buffer, int offset, int count, [CallerMemberName] string memberName = null)
+        public static void DumpBuffer(object thisOrContextObject, byte[] buffer, int offset, int count, [CallerMemberName] string? memberName = null)
         {
             if (IsEnabled)
             {
@@ -338,7 +339,7 @@ namespace System.Net
         /// <param name="count">The number of bytes to log.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static unsafe void DumpBuffer(object thisOrContextObject, IntPtr bufferPtr, int count, [CallerMemberName] string memberName = null)
+        public static unsafe void DumpBuffer(object thisOrContextObject, IntPtr bufferPtr, int count, [CallerMemberName] string? memberName = null)
         {
             Debug.Assert(bufferPtr != IntPtr.Zero);
             Debug.Assert(count >= 0);
@@ -355,7 +356,7 @@ namespace System.Net
         }
 
         [Event(DumpArrayEventId, Level = EventLevel.Verbose, Keywords = Keywords.Debug)]
-        private unsafe void DumpBuffer(string thisOrContextObject, string memberName, byte[] buffer) =>
+        private unsafe void DumpBuffer(string thisOrContextObject, string? memberName, byte[] buffer) =>
             WriteEvent(DumpArrayEventId, thisOrContextObject, memberName ?? MissingMember, buffer);
         #endregion
 
@@ -365,7 +366,7 @@ namespace System.Net
         /// <param name="second">The second object.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Associate(object first, object second, [CallerMemberName] string memberName = null)
+        public static void Associate(object first, object second, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(first);
             DebugValidateArg(second);
@@ -378,7 +379,7 @@ namespace System.Net
         /// <param name="second">The second object.</param>
         /// <param name="memberName">The calling member.</param>
         [NonEvent]
-        public static void Associate(object thisOrContextObject, object first, object second, [CallerMemberName] string memberName = null)
+        public static void Associate(object thisOrContextObject, object first, object second, [CallerMemberName] string? memberName = null)
         {
             DebugValidateArg(thisOrContextObject);
             DebugValidateArg(first);
@@ -387,7 +388,7 @@ namespace System.Net
         }
 
         [Event(AssociateEventId, Level = EventLevel.Informational, Keywords = Keywords.Default, Message = "[{2}]<-->[{3}]")]
-        private void Associate(string thisOrContextObject, string memberName, string first, string second) =>
+        private void Associate(string thisOrContextObject, string? memberName, string first, string second) =>
             WriteEvent(AssociateEventId, thisOrContextObject, memberName ?? MissingMember, first, second);
         #endregion
         #endregion
@@ -404,7 +405,7 @@ namespace System.Net
         }
 
         [Conditional("DEBUG_NETEVENTSOURCE_MISUSE")]
-        private static void DebugValidateArg(FormattableString arg)
+        private static void DebugValidateArg(FormattableString? arg)
         {
             Debug.Assert(IsEnabled || arg == null, $"Should not be formatting FormattableString \"{arg}\" if tracing isn't enabled");
         }
@@ -419,7 +420,7 @@ namespace System.Net
         public static int GetHashCode(object value) => value?.GetHashCode() ?? 0;
 
         [NonEvent]
-        public static object Format(object value)
+        public static object Format(object? value)
         {
             // If it's null, return a known string for null values
             if (value == null)
@@ -428,7 +429,7 @@ namespace System.Net
             }
 
             // Give another partial implementation a chance to provide its own string representation
-            string result = null;
+            string? result = null;
             AdditionalCustomizedToString(value, ref result);
             if (result != null)
             {
@@ -436,22 +437,19 @@ namespace System.Net
             }
 
             // Format arrays with their element type name and length
-            Array arr = value as Array;
-            if (arr != null)
+            if (value is Array arr)
             {
                 return $"{arr.GetType().GetElementType()}[{((Array)value).Length}]";
             }
 
             // Format ICollections as the name and count
-            ICollection c = value as ICollection;
-            if (c != null)
+            if (value is ICollection c)
             {
                 return $"{c.GetType().Name}({c.Count})";
             }
 
             // Format SafeHandles as their type, hash code, and pointer value
-            SafeHandle handle = value as SafeHandle;
-            if (handle != null)
+            if (value is SafeHandle handle)
             {
                 return $"{handle.GetType().Name}:{handle.GetHashCode()}(0x{handle.DangerousGetHandle():X})";
             }
@@ -464,7 +462,7 @@ namespace System.Net
 
             // If the string representation of the instance would just be its type name,
             // use its id instead.
-            string toString = value.ToString();
+            string? toString = value.ToString();
             if (toString == null || toString == value.GetType().FullName)
             {
                 return IdOf(value);
@@ -484,7 +482,7 @@ namespace System.Net
                 case 2: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)));
                 case 3: return string.Format(s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)), Format(s.GetArgument(2)));
                 default:
-                    object[] args = s.GetArguments();
+                    object?[] args = s.GetArguments();
                     object[] formattedArgs = new object[args.Length];
                     for (int i = 0; i < args.Length; i++)
                     {
@@ -494,7 +492,7 @@ namespace System.Net
             }
         }
 
-        static partial void AdditionalCustomizedToString<T>(T value, ref string result);
+        static partial void AdditionalCustomizedToString<T>(T value, ref string? result);
         #endregion
 
         #region Custom WriteEvent overloads
index 88b0d4c..05473cc 100644 (file)
@@ -90,32 +90,32 @@ namespace System.Net
         protected WebHeaderCollection(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) { }
         public override string[] AllKeys { get { throw null; } }
         public override int Count { get { throw null; } }
-        public string this[System.Net.HttpRequestHeader header] { get { throw null; } set { } }
-        public string this[System.Net.HttpResponseHeader header] { get { throw null; } set { } }
-        public new string this[string name] { get { throw null; } set { } }
+        public string? this[System.Net.HttpRequestHeader header] { get { throw null; } set { } }
+        public string? this[System.Net.HttpResponseHeader header] { get { throw null; } set { } }
+        public new string? this[string name] { get { throw null; } set { } }
         public override System.Collections.Specialized.NameObjectCollectionBase.KeysCollection Keys { get { throw null; } }
-        public void Add(System.Net.HttpRequestHeader header, string value) { }
-        public void Add(System.Net.HttpResponseHeader header, string value) { }
+        public void Add(System.Net.HttpRequestHeader header, string? value) { }
+        public void Add(System.Net.HttpResponseHeader header, string? value) { }
         public void Add(string header) { }
-        public override void Add(string name, string value) { }
-        protected void AddWithoutValidate(string headerName, string headerValue) { }
+        public override void Add(string name, string? value) { }
+        protected void AddWithoutValidate(string headerName, string? headerValue) { }
         public override void Clear() { }
-        public override string Get(int index) { throw null; }
-        public override string Get(string name) { throw null; }
+        public override string? Get(int index) { throw null; }
+        public override string? Get(string? name) { throw null; }
         public override System.Collections.IEnumerator GetEnumerator() { throw null; }
         public override string GetKey(int index) { throw null; }
         public override void GetObjectData(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) { }
-        public override string[] GetValues(int index) { throw null; }
-        public override string[] GetValues(string header) { throw null; }
+        public override string[]? GetValues(int index) { throw null; }
+        public override string[]? GetValues(string header) { throw null; }
         public static bool IsRestricted(string headerName) { throw null; }
         public static bool IsRestricted(string headerName, bool response) { throw null; }
-        public override void OnDeserialization(object sender) { }
+        public override void OnDeserialization(object? sender) { }
         public void Remove(System.Net.HttpRequestHeader header) { }
         public void Remove(System.Net.HttpResponseHeader header) { }
         public override void Remove(string name) { }
-        public void Set(System.Net.HttpRequestHeader header, string value) { }
-        public void Set(System.Net.HttpResponseHeader header, string value) { }
-        public override void Set(string name, string value) { }
+        public void Set(System.Net.HttpRequestHeader header, string? value) { }
+        public void Set(System.Net.HttpResponseHeader header, string? value) { }
+        public override void Set(string name, string? value) { }
         void System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext streamingContext) { }
         public byte[] ToByteArray() { throw null; }
         public override string ToString() { throw null; }
index cca3bf7..4264d05 100644 (file)
@@ -1,6 +1,9 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <Configurations>netcoreapp-Debug;netcoreapp-Release;uap-Debug;uap-Release</Configurations>
+    <Nullable>enable</Nullable>
+    <!-- Disable 8610 (Nullability of reference type doesn't match overridden member) warning so it doesn't turn into an error -->
+    <NoWarn>$(NoWarn);8610</NoWarn>
   </PropertyGroup>
   <ItemGroup>
     <Compile Include="System.Net.WebHeaderCollection.cs" />
index 454350d..fac070f 100644 (file)
@@ -3,6 +3,7 @@
     <AssemblyName>System.Net.WebHeaderCollection</AssemblyName>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <Configurations>netcoreapp-Debug;netcoreapp-Release;uap-Windows_NT-Debug;uap-Windows_NT-Release</Configurations>
+    <Nullable>enable</Nullable>
   </PropertyGroup>
   <ItemGroup>
     <Compile Include="System\Net\WebHeaderCollection.cs" />
index a11dcd6..d261a94 100644 (file)
@@ -142,7 +142,7 @@ namespace System.Net
         {
             get
             {
-                HeaderInfo tempHeaderInfo = (HeaderInfo)s_headerHashTable[name];
+                HeaderInfo? tempHeaderInfo = (HeaderInfo?)s_headerHashTable[name];
                 if (tempHeaderInfo == null)
                 {
                     return s_unknownHeaderInfo;
index 69f5341..875caac 100644 (file)
@@ -9,6 +9,7 @@ using System.Diagnostics;
 using System.Globalization;
 using System.Runtime.Serialization;
 using System.Text;
+using System.Diagnostics.CodeAnalysis;
 
 namespace System.Net
 {
@@ -32,9 +33,9 @@ namespace System.Net
         private const int ApproxAveHeaderLineSize = 30;
         private const int ApproxHighAvgNumHeaders = 16;
         private WebHeaderCollectionType _type;
-        private NameValueCollection _innerCollection;
+        private NameValueCollection? _innerCollection;
 
-        private static HeaderInfoTable _headerInfo;
+        private static HeaderInfoTable? _headerInfo;
 
         protected WebHeaderCollection(SerializationInfo serializationInfo, StreamingContext streamingContext)
         {
@@ -91,7 +92,7 @@ namespace System.Net
             }
         }
 
-        public string this[HttpRequestHeader header]
+        public string? this[HttpRequestHeader header]
         {
             get
             {
@@ -111,7 +112,7 @@ namespace System.Net
             }
         }
 
-        public string this[HttpResponseHeader header]
+        public string? this[HttpResponseHeader header]
         {
             get
             {
@@ -131,7 +132,9 @@ namespace System.Net
             }
         }
 
-        public override void Set(string name, string value)
+#pragma warning disable CS8610 // Nullability of parameter 'name' doesn't match overridden member
+        public override void Set(string name, string? value)
+#pragma warning restore CS8610
         {
             if (string.IsNullOrEmpty(name))
             {
@@ -153,7 +156,7 @@ namespace System.Net
             InnerCollection.Set(name, value);
         }
 
-        public void Set(HttpRequestHeader header, string value)
+        public void Set(HttpRequestHeader header, string? value)
         {
             if (!AllowHttpRequestHeader)
             {
@@ -162,7 +165,7 @@ namespace System.Net
             this.Set(header.GetName(), value);
         }
 
-        public void Set(HttpResponseHeader header, string value)
+        public void Set(HttpResponseHeader header, string? value)
         {
             if (!AllowHttpResponseHeader)
             {
@@ -206,7 +209,7 @@ namespace System.Net
             this.Remove(header.GetName());
         }
 
-        public override void OnDeserialization(object sender)
+        public override void OnDeserialization(object? sender)
         {
             // Nop in desktop
         }
@@ -222,7 +225,7 @@ namespace System.Net
             return response ? HeaderInfo[headerName].IsResponseRestricted : HeaderInfo[headerName].IsRequestRestricted;
         }
 
-        public override string[] GetValues(int index)
+        public override string[]? GetValues(int index)
         {
             return InnerCollection.GetValues(index);
         }
@@ -238,12 +241,14 @@ namespace System.Net
         //     header      - Name of the header.
         // Return Value:
         //     string[] - array of parsed string objects
-        public override string[] GetValues(string header)
+#pragma warning disable CS8610 // Nullability of parameter 'header' doesn't match overridden member
+        public override string[]? GetValues(string header)
+#pragma warning restore CS8610
         {
             // First get the information about the header and the values for
             // the header.
-            HeaderInfo info = HeaderInfo[header];
-            string[] values = InnerCollection.GetValues(header);
+            HeaderInfo info = HeaderInfo[header!];
+            string[]? values = InnerCollection.GetValues(header);
             // If we have no information about the header or it doesn't allow
             // multiple values, just return the values.
             if (info == null || values == null || !info.AllowMultiValues)
@@ -257,7 +262,7 @@ namespace System.Net
             // We do some optimazation here, where we try not to copy the
             // values unless there really is one that have multiple values.
             string[] tempValues;
-            List<string> valueList = null;
+            List<string>? valueList = null;
             for (int i = 0; i < values.Length; i++)
             {
                 // Parse this value header.
@@ -296,7 +301,7 @@ namespace System.Net
 
         public override string GetKey(int index)
         {
-            return InnerCollection.GetKey(index);
+            return InnerCollection.GetKey(index)!;
         }
 
         public override void Clear()
@@ -308,7 +313,7 @@ namespace System.Net
             }
         }
 
-        public override string Get(int index)
+        public override string? Get(int index)
         {
             if (_innerCollection == null)
             {
@@ -317,7 +322,7 @@ namespace System.Net
             return _innerCollection.Get(index);
         }
 
-        public override string Get(string name)
+        public override string? Get(string? name)
         {
             if (_innerCollection == null)
             {
@@ -326,7 +331,7 @@ namespace System.Net
             return _innerCollection.Get(name);
         }
 
-        public void Add(HttpRequestHeader header, string value)
+        public void Add(HttpRequestHeader header, string? value)
         {
             if (!AllowHttpRequestHeader)
             {
@@ -335,7 +340,7 @@ namespace System.Net
             this.Add(header.GetName(), value);
         }
 
-        public void Add(HttpResponseHeader header, string value)
+        public void Add(HttpResponseHeader header, string? value)
         {
             if (!AllowHttpResponseHeader)
             {
@@ -380,7 +385,9 @@ namespace System.Net
             InnerCollection.Add(name, value);
         }
 
-        public override void Add(string name, string value)
+#pragma warning disable CS8610 // Nullability of parameter 'name' doesn't match overridden member
+        public override void Add(string name, string? value)
+#pragma warning restore CS8610
         {
             if (name == null)
             {
@@ -406,7 +413,7 @@ namespace System.Net
             InnerCollection.Add(name, value);
         }
 
-        protected void AddWithoutValidate(string headerName, string headerValue)
+        protected void AddWithoutValidate(string headerName, string? headerValue)
         {
             headerName = HttpValidationHelpers.CheckBadHeaderNameChars(headerName);
             headerValue = HttpValidationHelpers.CheckBadHeaderValueChars(headerValue);
@@ -453,7 +460,9 @@ namespace System.Net
         /// <devdoc>
         ///    <para>Removes the specified header.</para>
         /// </devdoc>
+#pragma warning disable CS8610 // Nullability of parameter 'name' doesn't match overridden member
         public override void Remove(string name)
+#pragma warning restore CS8610
         {
             if (string.IsNullOrEmpty(name))
             {
@@ -494,9 +503,9 @@ namespace System.Net
 
             var sb = new StringBuilder(ApproxAveHeaderLineSize * Count);
 
-            foreach (string key in InnerCollection)
+            foreach (string? key in InnerCollection)
             {
-                string val = InnerCollection.Get(key);
+                string? val = InnerCollection.Get(key);
                 sb.Append(key)
                     .Append(": ")
                     .Append(val)
@@ -538,7 +547,7 @@ namespace System.Net
         {
             get
             {
-                return InnerCollection.AllKeys;
+                return InnerCollection.AllKeys!;
             }
         }