diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.cs b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.cs index 6c83ffe225776bc214b6421760fcd5aa1d9cb4f6..a7a7908f1f32e504405829ae8257ce84676a30e0 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.cs @@ -8,11 +8,11 @@ namespace Microsoft.Extensions.Configuration { public static partial class ConfigurationExtensions { - public static Microsoft.Extensions.Configuration.IConfigurationBuilder Add(this Microsoft.Extensions.Configuration.IConfigurationBuilder builder, System.Action configureSource) where TSource : Microsoft.Extensions.Configuration.IConfigurationSource, new() { throw null; } - public static System.Collections.Generic.IEnumerable> AsEnumerable(this Microsoft.Extensions.Configuration.IConfiguration configuration) { throw null; } - public static System.Collections.Generic.IEnumerable> AsEnumerable(this Microsoft.Extensions.Configuration.IConfiguration configuration, bool makePathsRelative) { throw null; } - public static bool Exists(this Microsoft.Extensions.Configuration.IConfigurationSection section) { throw null; } - public static string GetConnectionString(this Microsoft.Extensions.Configuration.IConfiguration configuration, string name) { throw null; } + public static Microsoft.Extensions.Configuration.IConfigurationBuilder Add(this Microsoft.Extensions.Configuration.IConfigurationBuilder builder, System.Action? configureSource) where TSource : Microsoft.Extensions.Configuration.IConfigurationSource, new() { throw null; } + public static System.Collections.Generic.IEnumerable> AsEnumerable(this Microsoft.Extensions.Configuration.IConfiguration configuration) { throw null; } + public static System.Collections.Generic.IEnumerable> AsEnumerable(this Microsoft.Extensions.Configuration.IConfiguration configuration, bool makePathsRelative) { throw null; } + public static bool Exists([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] this Microsoft.Extensions.Configuration.IConfigurationSection? section) { throw null; } + public static string? GetConnectionString(this Microsoft.Extensions.Configuration.IConfiguration configuration, string name) { throw null; } public static Microsoft.Extensions.Configuration.IConfigurationSection GetRequiredSection(this Microsoft.Extensions.Configuration.IConfiguration configuration, string key) { throw null; } } [System.AttributeUsageAttribute(System.AttributeTargets.Property)] @@ -26,8 +26,9 @@ public static partial class ConfigurationPath public static readonly string KeyDelimiter; public static string Combine(System.Collections.Generic.IEnumerable pathSegments) { throw null; } public static string Combine(params string[] pathSegments) { throw null; } - public static string GetParentPath(string path) { throw null; } - public static string GetSectionKey(string path) { throw null; } + public static string? GetParentPath(string? path) { throw null; } + [return: System.Diagnostics.CodeAnalysis.NotNullIfNotNull("path")] + public static string? GetSectionKey(string? path) { throw null; } } public static partial class ConfigurationRootExtensions { @@ -35,7 +36,7 @@ public static partial class ConfigurationRootExtensions } public partial interface IConfiguration { - string this[string key] { get; set; } + string? this[string key] { get; set; } System.Collections.Generic.IEnumerable GetChildren(); Microsoft.Extensions.Primitives.IChangeToken GetReloadToken(); Microsoft.Extensions.Configuration.IConfigurationSection GetSection(string key); @@ -49,11 +50,11 @@ public partial interface IConfigurationBuilder } public partial interface IConfigurationProvider { - System.Collections.Generic.IEnumerable GetChildKeys(System.Collections.Generic.IEnumerable earlierKeys, string parentPath); + System.Collections.Generic.IEnumerable GetChildKeys(System.Collections.Generic.IEnumerable earlierKeys, string? parentPath); Microsoft.Extensions.Primitives.IChangeToken GetReloadToken(); void Load(); - void Set(string key, string value); - bool TryGet(string key, out string value); + void Set(string key, string? value); + bool TryGet(string key, out string? value); } public partial interface IConfigurationRoot : Microsoft.Extensions.Configuration.IConfiguration { @@ -64,7 +65,7 @@ public partial interface IConfigurationSection : Microsoft.Extensions.Configurat { string Key { get; } string Path { get; } - string Value { get; set; } + string? Value { get; set; } } public partial interface IConfigurationSource { diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csproj b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csproj index f026a351a444f7114a2a2ba314e7bf516503c6a8..3e4c0cc8363b97692e1129d2b80ea60b49f5ea41 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csproj +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csproj @@ -1,6 +1,7 @@ - netstandard2.0;$(NetFrameworkMinimum) + $(NetCoreAppCurrent);netstandard2.0;$(NetFrameworkMinimum) + enable @@ -8,4 +9,8 @@ + + + + diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationExtensions.cs b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationExtensions.cs index 71cc406e34d17cb9345c9c7225a4caf256ed107f..07999be0e72bc93d453b933507a620eaec60d48f 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationExtensions.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; namespace Microsoft.Extensions.Configuration @@ -18,7 +19,7 @@ public static class ConfigurationExtensions /// The builder to add to. /// Configures the source secrets. /// The . - public static IConfigurationBuilder Add(this IConfigurationBuilder builder, Action configureSource) where TSource : IConfigurationSource, new() + public static IConfigurationBuilder Add(this IConfigurationBuilder builder, Action? configureSource) where TSource : IConfigurationSource, new() { var source = new TSource(); configureSource?.Invoke(source); @@ -31,9 +32,9 @@ public static IConfigurationBuilder Add(this IConfigurationBuilder buil /// The configuration to enumerate. /// The connection string key. /// The connection string. - public static string GetConnectionString(this IConfiguration configuration, string name) + public static string? GetConnectionString(this IConfiguration configuration, string name) { - return configuration?.GetSection("ConnectionStrings")?[name]; + return configuration?.GetSection("ConnectionStrings")[name]; } /// @@ -41,7 +42,7 @@ public static string GetConnectionString(this IConfiguration configuration, stri /// /// The configuration to enumerate. /// An enumeration of key value pairs. - public static IEnumerable> AsEnumerable(this IConfiguration configuration) => configuration.AsEnumerable(makePathsRelative: false); + public static IEnumerable> AsEnumerable(this IConfiguration configuration) => configuration.AsEnumerable(makePathsRelative: false); /// /// Get the enumeration of key value pairs within the @@ -49,19 +50,18 @@ public static string GetConnectionString(this IConfiguration configuration, stri /// The configuration to enumerate. /// If true, the child keys returned will have the current configuration's Path trimmed from the front. /// An enumeration of key value pairs. - public static IEnumerable> AsEnumerable(this IConfiguration configuration, bool makePathsRelative) + public static IEnumerable> AsEnumerable(this IConfiguration configuration, bool makePathsRelative) { var stack = new Stack(); stack.Push(configuration); - var rootSection = configuration as IConfigurationSection; - int prefixLength = (makePathsRelative && rootSection != null) ? rootSection.Path.Length + 1 : 0; + int prefixLength = (makePathsRelative && configuration is IConfigurationSection rootSection) ? rootSection.Path.Length + 1 : 0; while (stack.Count > 0) { IConfiguration config = stack.Pop(); // Don't include the sections value if we are removing paths, since it will be an empty key if (config is IConfigurationSection section && (!makePathsRelative || config != configuration)) { - yield return new KeyValuePair(section.Path.Substring(prefixLength), section.Value); + yield return new KeyValuePair(section.Path.Substring(prefixLength), section.Value); } foreach (IConfigurationSection child in config.GetChildren()) { @@ -75,7 +75,7 @@ public static string GetConnectionString(this IConfiguration configuration, stri /// /// The section to enumerate. /// if the section has values or children; otherwise, . - public static bool Exists(this IConfigurationSection section) + public static bool Exists([NotNullWhen(true)] this IConfigurationSection? section) { if (section == null) { diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationPath.cs b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationPath.cs index 2ad9e073d4f4e06f2a9da1e0c9b1d524e0d828ff..814d9113c840fa0a04234e1c65f8977dca5d5c77 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationPath.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationPath.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; namespace Microsoft.Extensions.Configuration { @@ -49,7 +50,8 @@ public static string Combine(IEnumerable pathSegments) /// /// The path. /// The last path segment of the path. - public static string GetSectionKey(string path) + [return: NotNullIfNotNull("path")] + public static string? GetSectionKey(string? path) { if (string.IsNullOrEmpty(path)) { @@ -65,7 +67,7 @@ public static string GetSectionKey(string path) /// /// The path. /// The original path minus the last individual segment found in it. Null if the original path corresponds to a top level node. - public static string GetParentPath(string path) + public static string? GetParentPath(string? path) { if (string.IsNullOrEmpty(path)) { diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationRootExtensions.cs b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationRootExtensions.cs index b6976a734cfa9ccbbf1450e12656bdc6110d6661..39abb8ec871e9f1b79d6e55bc6666823d31c8645 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationRootExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationRootExtensions.cs @@ -25,7 +25,7 @@ public static string GetDebugView(this IConfigurationRoot root) { foreach (IConfigurationSection child in children) { - (string Value, IConfigurationProvider Provider) valueAndProvider = GetValueAndProvider(root, child.Path); + (string? Value, IConfigurationProvider? Provider) valueAndProvider = GetValueAndProvider(root, child.Path); if (valueAndProvider.Provider != null) { @@ -57,13 +57,13 @@ public static string GetDebugView(this IConfigurationRoot root) return builder.ToString(); } - private static (string Value, IConfigurationProvider Provider) GetValueAndProvider( + private static (string? Value, IConfigurationProvider? Provider) GetValueAndProvider( IConfigurationRoot root, string key) { foreach (IConfigurationProvider provider in root.Providers.Reverse()) { - if (provider.TryGet(key, out string value)) + if (provider.TryGet(key, out string? value)) { return (value, provider); } diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfiguration.cs b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfiguration.cs index ce6b52b6601fa0fbc25f499e189861eecab2535a..0e9da61368546e862aa81b88a52ebc754986e069 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfiguration.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfiguration.cs @@ -16,7 +16,7 @@ public interface IConfiguration /// /// The configuration key. /// The configuration value. - string this[string key] { get; set; } + string? this[string key] { get; set; } /// /// Gets a configuration sub-section with the specified key. diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationProvider.cs index 14d7940d41f02e68c5ee01ca649fdf446388447c..20a7e5a6694f80f539cc01fe9dc37d7ce99cddfa 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationProvider.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationProvider.cs @@ -17,14 +17,14 @@ public interface IConfigurationProvider /// The key. /// The value. /// True if a value for the specified key was found, otherwise false. - bool TryGet(string key, out string value); + bool TryGet(string key, out string? value); /// /// Sets a configuration value for the specified key. /// /// The key. /// The value. - void Set(string key, string value); + void Set(string key, string? value); /// /// Returns a change token if this provider supports change tracking, null otherwise. @@ -45,6 +45,6 @@ public interface IConfigurationProvider /// The child keys returned by the preceding providers for the same parent path. /// The parent path. /// The child keys. - IEnumerable GetChildKeys(IEnumerable earlierKeys, string parentPath); + IEnumerable GetChildKeys(IEnumerable earlierKeys, string? parentPath); } } diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationSection.cs b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationSection.cs index 4e47e7cca87b2e8343f6af7e431987e207146ec7..00047e94635702c82f3341b3d40978831ee8c3d2 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationSection.cs +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/IConfigurationSection.cs @@ -21,6 +21,6 @@ public interface IConfigurationSection : IConfiguration /// /// Gets or sets the section value. /// - string Value { get; set; } + string? Value { get; set; } } } diff --git a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/Microsoft.Extensions.Configuration.Abstractions.csproj b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/Microsoft.Extensions.Configuration.Abstractions.csproj index 0b79f05f830223dda3552e26067043dbdc41f96a..49aabd359e3fce1c059ccc441662ed7ebac545eb 100644 --- a/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/Microsoft.Extensions.Configuration.Abstractions.csproj +++ b/src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/Microsoft.Extensions.Configuration.Abstractions.csproj @@ -1,8 +1,11 @@ - netstandard2.0;$(NetFrameworkMinimum) + $(NetCoreAppCurrent);netstandard2.0;$(NetFrameworkMinimum) + enable true + + false Abstractions of key-value pair based configuration. Commonly Used Types: diff --git a/src/libraries/Microsoft.Extensions.Options.ConfigurationExtensions/tests/FakeConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Options.ConfigurationExtensions/tests/FakeConfigurationProvider.cs index 62f25a8d5862ae0350bc7eb5dc6d6ac850c5e463..0fe4747f666620b0e93c8664d29d06e4c72710f8 100644 --- a/src/libraries/Microsoft.Extensions.Options.ConfigurationExtensions/tests/FakeConfigurationProvider.cs +++ b/src/libraries/Microsoft.Extensions.Options.ConfigurationExtensions/tests/FakeConfigurationProvider.cs @@ -11,7 +11,7 @@ internal class FakeConfigurationProvider : MemoryConfigurationProvider, IConfigu public FakeConfigurationProvider(MemoryConfigurationSource source) : base(source) { } - public new void Set(string key, string value) + public new void Set(string key, string? value) { base.Set(key, value); OnReload();