From ef86a4d7992a3731071d0321f800329792ceaa6d Mon Sep 17 00:00:00 2001 From: Maksym Koshovyi Date: Sat, 14 Aug 2021 17:01:18 +0300 Subject: [PATCH 1/7] Annotate src --- .../src/IFileInfo.cs | 2 +- .../src/IFileProvider.cs | 6 +++--- .../Microsoft.Extensions.FileProviders.Abstractions.csproj | 1 + .../src/NotFoundDirectoryContents.cs | 2 +- .../src/NotFoundFileInfo.cs | 4 +++- .../src/NullChangeToken.cs | 2 +- .../src/NullFileProvider.cs | 6 +++--- 7 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs index d1f620c211a986..08b364ca2d8a46 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs @@ -24,7 +24,7 @@ public interface IFileInfo /// /// The path to the file, including the file name. Return null if the file is not directly accessible. /// - string PhysicalPath { get; } + string? PhysicalPath { get; } /// /// The name of the file or directory, not including any path. diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs index bce6d2d81f65e9..0f891daa67370e 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs @@ -15,20 +15,20 @@ public interface IFileProvider /// /// Relative path that identifies the file. /// The file information. Caller must check Exists property. - IFileInfo GetFileInfo(string subpath); + IFileInfo GetFileInfo(string? subpath); /// /// Enumerate a directory at the given path, if any. /// /// Relative path that identifies the directory. /// Returns the contents of the directory. - IDirectoryContents GetDirectoryContents(string subpath); + IDirectoryContents GetDirectoryContents(string? subpath); /// /// Creates a for the specified . /// /// Filter string used to determine what files or folders to monitor. Example: **/*.cs, *.*, subFolder/**/*.cshtml. /// An that is notified when a file matching is added, modified or deleted. - IChangeToken Watch(string filter); + IChangeToken Watch(string? filter); } } diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/Microsoft.Extensions.FileProviders.Abstractions.csproj b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/Microsoft.Extensions.FileProviders.Abstractions.csproj index 07289f58670e5b..65a64a494f92ce 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/Microsoft.Extensions.FileProviders.Abstractions.csproj +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/Microsoft.Extensions.FileProviders.Abstractions.csproj @@ -3,6 +3,7 @@ Microsoft.Extensions.FileProviders $(NetCoreAppCurrent);netstandard2.0;net461 + enable true Abstractions of files and directories. diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundDirectoryContents.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundDirectoryContents.cs index 8f4feb94eaf6c8..d9240fa8c740bd 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundDirectoryContents.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundDirectoryContents.cs @@ -15,7 +15,7 @@ public class NotFoundDirectoryContents : IDirectoryContents /// /// A shared instance of /// - public static NotFoundDirectoryContents Singleton { get; } = new NotFoundDirectoryContents(); + public static NotFoundDirectoryContents Singleton { get; } = new(); /// /// Always false. diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundFileInfo.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundFileInfo.cs index 3640a8ec424dd4..13707bae3339c3 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundFileInfo.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NotFoundFileInfo.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; using System.IO; namespace Microsoft.Extensions.FileProviders @@ -46,13 +47,14 @@ public NotFoundFileInfo(string name) /// /// Always null. /// - public string PhysicalPath => null; + public string? PhysicalPath => null; /// /// Always throws. A stream cannot be created for non-existing file. /// /// Always thrown. /// Does not return + [DoesNotReturn] public Stream CreateReadStream() { throw new FileNotFoundException(SR.Format(SR.FileNotExists, Name)); diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullChangeToken.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullChangeToken.cs index 19a7303555560d..b35546f2074860 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullChangeToken.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullChangeToken.cs @@ -36,7 +36,7 @@ private NullChangeToken() /// This parameter is ignored /// This parameter is ignored /// A disposable object that noops on dispose. - public IDisposable RegisterChangeCallback(Action callback, object state) + public IDisposable RegisterChangeCallback(Action callback, object? state) { return EmptyDisposable.Instance; } diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs index 17c87efff85eac..1abd214b8cfc21 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs @@ -15,20 +15,20 @@ public class NullFileProvider : IFileProvider /// /// A path under the root directory. This parameter is ignored. /// A that does not exist and does not contain any contents. - public IDirectoryContents GetDirectoryContents(string subpath) => NotFoundDirectoryContents.Singleton; + public IDirectoryContents GetDirectoryContents(string? subpath) => NotFoundDirectoryContents.Singleton; /// /// Locate a non-existent file. /// /// A path under the root directory. /// A representing a non-existent file at the given path. - public IFileInfo GetFileInfo(string subpath) => new NotFoundFileInfo(subpath); + public IFileInfo GetFileInfo(string? subpath) => new NotFoundFileInfo(subpath); /// /// Returns a that monitors nothing. /// /// Filter string used to determine what files or folders to monitor. This parameter is ignored. /// A that does not register callbacks. - public IChangeToken Watch(string filter) => NullChangeToken.Singleton; + public IChangeToken Watch(string? filter) => NullChangeToken.Singleton; } } From 3cccc99fa99a644c49db0bd3c788e2f582bdef1e Mon Sep 17 00:00:00 2001 From: Maksym Koshovyi Date: Sat, 14 Aug 2021 17:05:39 +0300 Subject: [PATCH 2/7] Annotate ref --- ...ft.Extensions.FileProviders.Abstractions.cs | 18 +++++++++--------- ...xtensions.FileProviders.Abstractions.csproj | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs index 3982a62c75ce9a..57caf718836aa3 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs @@ -17,14 +17,14 @@ public partial interface IFileInfo System.DateTimeOffset LastModified { get; } long Length { get; } string Name { get; } - string PhysicalPath { get; } + string? PhysicalPath { get; } System.IO.Stream CreateReadStream(); } public partial interface IFileProvider { - Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string subpath); - Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string subpath); - Microsoft.Extensions.Primitives.IChangeToken Watch(string filter); + Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string? subpath); + Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string? subpath); + Microsoft.Extensions.Primitives.IChangeToken Watch(string? filter); } public partial class NotFoundDirectoryContents : Microsoft.Extensions.FileProviders.IDirectoryContents, System.Collections.Generic.IEnumerable, System.Collections.IEnumerable { @@ -42,7 +42,7 @@ public NotFoundFileInfo(string name) { } public System.DateTimeOffset LastModified { get { throw null; } } public long Length { get { throw null; } } public string Name { get { throw null; } } - public string PhysicalPath { get { throw null; } } + public string? PhysicalPath { get { throw null; } } public System.IO.Stream CreateReadStream() { throw null; } } public partial class NullChangeToken : Microsoft.Extensions.Primitives.IChangeToken @@ -51,13 +51,13 @@ internal NullChangeToken() { } public bool ActiveChangeCallbacks { get { throw null; } } public bool HasChanged { get { throw null; } } public static Microsoft.Extensions.FileProviders.NullChangeToken Singleton { get { throw null; } } - public System.IDisposable RegisterChangeCallback(System.Action callback, object state) { throw null; } + public System.IDisposable RegisterChangeCallback(System.Action callback, object? state) { throw null; } } public partial class NullFileProvider : Microsoft.Extensions.FileProviders.IFileProvider { public NullFileProvider() { } - public Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string subpath) { throw null; } - public Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string subpath) { throw null; } - public Microsoft.Extensions.Primitives.IChangeToken Watch(string filter) { throw null; } + public Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string? subpath) { throw null; } + public Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string? subpath) { throw null; } + public Microsoft.Extensions.Primitives.IChangeToken Watch(string? filter) { throw null; } } } diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.csproj b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.csproj index bd02f83be9189b..b198cac2def854 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.csproj +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.csproj @@ -1,6 +1,7 @@ $(NetCoreAppCurrent);netstandard2.0;net461 + enable From cc3b76315b65800a6f7ea1f80a77c052a4ebf0e4 Mon Sep 17 00:00:00 2001 From: Maksym Koshovyi Date: Sat, 14 Aug 2021 17:16:01 +0300 Subject: [PATCH 3/7] GetFileInfo.subpath is not null --- .../ref/Microsoft.Extensions.FileProviders.Abstractions.cs | 4 ++-- .../src/IFileProvider.cs | 2 +- .../src/NullFileProvider.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs index 57caf718836aa3..a44fe674775a44 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs @@ -23,7 +23,7 @@ public partial interface IFileInfo public partial interface IFileProvider { Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string? subpath); - Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string? subpath); + Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string subpath); Microsoft.Extensions.Primitives.IChangeToken Watch(string? filter); } public partial class NotFoundDirectoryContents : Microsoft.Extensions.FileProviders.IDirectoryContents, System.Collections.Generic.IEnumerable, System.Collections.IEnumerable @@ -57,7 +57,7 @@ public partial class NullFileProvider : Microsoft.Extensions.FileProviders.IFile { public NullFileProvider() { } public Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string? subpath) { throw null; } - public Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string? subpath) { throw null; } + public Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string subpath) { throw null; } public Microsoft.Extensions.Primitives.IChangeToken Watch(string? filter) { throw null; } } } diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs index 0f891daa67370e..3f6cb43ce29a0a 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs @@ -15,7 +15,7 @@ public interface IFileProvider /// /// Relative path that identifies the file. /// The file information. Caller must check Exists property. - IFileInfo GetFileInfo(string? subpath); + IFileInfo GetFileInfo(string subpath); /// /// Enumerate a directory at the given path, if any. diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs index 1abd214b8cfc21..1ad277592620af 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs @@ -22,7 +22,7 @@ public class NullFileProvider : IFileProvider /// /// A path under the root directory. /// A representing a non-existent file at the given path. - public IFileInfo GetFileInfo(string? subpath) => new NotFoundFileInfo(subpath); + public IFileInfo GetFileInfo(string subpath) => new NotFoundFileInfo(subpath); /// /// Returns a that monitors nothing. From 9b3df8df5f052a696c6c32e0b70e1c0d92340316 Mon Sep 17 00:00:00 2001 From: Maksym Koshovyi Date: Sat, 14 Aug 2021 18:30:18 +0300 Subject: [PATCH 4/7] Update Microsoft.Extensions.FileProviders.Abstractions.cs --- .../ref/Microsoft.Extensions.FileProviders.Abstractions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs index a44fe674775a44..721b158e433f08 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs @@ -43,6 +43,7 @@ public NotFoundFileInfo(string name) { } public long Length { get { throw null; } } public string Name { get { throw null; } } public string? PhysicalPath { get { throw null; } } + [System.Diagnostics.CodeAnalysis.DoesNotReturn] public System.IO.Stream CreateReadStream() { throw null; } } public partial class NullChangeToken : Microsoft.Extensions.Primitives.IChangeToken From 4675f8654eff5967881a2153513a6f1d1e2108e4 Mon Sep 17 00:00:00 2001 From: Maksym Koshovyi Date: Sat, 14 Aug 2021 20:44:00 +0300 Subject: [PATCH 5/7] Commit to rerun CI --- .../src/IFileInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs index 08b364ca2d8a46..9a72b59b9e0ca5 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs @@ -12,7 +12,7 @@ namespace Microsoft.Extensions.FileProviders public interface IFileInfo { /// - /// True if resource exists in the underlying storage system. + /// True if resource exists in the underlying storage system /// bool Exists { get; } From ec132eedbdf214341e5fe402ed1732d63f4c4c8c Mon Sep 17 00:00:00 2001 From: Maksym Koshovyi Date: Sat, 14 Aug 2021 20:44:10 +0300 Subject: [PATCH 6/7] Revert "Commit to rerun CI" This reverts commit 4675f8654eff5967881a2153513a6f1d1e2108e4. --- .../src/IFileInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs index 9a72b59b9e0ca5..08b364ca2d8a46 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileInfo.cs @@ -12,7 +12,7 @@ namespace Microsoft.Extensions.FileProviders public interface IFileInfo { /// - /// True if resource exists in the underlying storage system + /// True if resource exists in the underlying storage system. /// bool Exists { get; } From cb6103abe1c1b715dd52e163e2522b1ad44545a4 Mon Sep 17 00:00:00 2001 From: Maksym Koshovyi Date: Wed, 25 Aug 2021 01:59:57 +0300 Subject: [PATCH 7/7] subpath is non-nullable --- .../Microsoft.Extensions.FileProviders.Abstractions.cs | 8 ++++---- .../src/IFileProvider.cs | 4 ++-- .../src/NullFileProvider.cs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs index 721b158e433f08..8d3d62bb9c8734 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/ref/Microsoft.Extensions.FileProviders.Abstractions.cs @@ -22,9 +22,9 @@ public partial interface IFileInfo } public partial interface IFileProvider { - Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string? subpath); + Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string subpath); Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string subpath); - Microsoft.Extensions.Primitives.IChangeToken Watch(string? filter); + Microsoft.Extensions.Primitives.IChangeToken Watch(string filter); } public partial class NotFoundDirectoryContents : Microsoft.Extensions.FileProviders.IDirectoryContents, System.Collections.Generic.IEnumerable, System.Collections.IEnumerable { @@ -57,8 +57,8 @@ internal NullChangeToken() { } public partial class NullFileProvider : Microsoft.Extensions.FileProviders.IFileProvider { public NullFileProvider() { } - public Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string? subpath) { throw null; } + public Microsoft.Extensions.FileProviders.IDirectoryContents GetDirectoryContents(string subpath) { throw null; } public Microsoft.Extensions.FileProviders.IFileInfo GetFileInfo(string subpath) { throw null; } - public Microsoft.Extensions.Primitives.IChangeToken Watch(string? filter) { throw null; } + public Microsoft.Extensions.Primitives.IChangeToken Watch(string filter) { throw null; } } } diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs index 3f6cb43ce29a0a..bce6d2d81f65e9 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/IFileProvider.cs @@ -22,13 +22,13 @@ public interface IFileProvider /// /// Relative path that identifies the directory. /// Returns the contents of the directory. - IDirectoryContents GetDirectoryContents(string? subpath); + IDirectoryContents GetDirectoryContents(string subpath); /// /// Creates a for the specified . /// /// Filter string used to determine what files or folders to monitor. Example: **/*.cs, *.*, subFolder/**/*.cshtml. /// An that is notified when a file matching is added, modified or deleted. - IChangeToken Watch(string? filter); + IChangeToken Watch(string filter); } } diff --git a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs index 1ad277592620af..17c87efff85eac 100644 --- a/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs +++ b/src/libraries/Microsoft.Extensions.FileProviders.Abstractions/src/NullFileProvider.cs @@ -15,7 +15,7 @@ public class NullFileProvider : IFileProvider /// /// A path under the root directory. This parameter is ignored. /// A that does not exist and does not contain any contents. - public IDirectoryContents GetDirectoryContents(string? subpath) => NotFoundDirectoryContents.Singleton; + public IDirectoryContents GetDirectoryContents(string subpath) => NotFoundDirectoryContents.Singleton; /// /// Locate a non-existent file. @@ -29,6 +29,6 @@ public class NullFileProvider : IFileProvider /// /// Filter string used to determine what files or folders to monitor. This parameter is ignored. /// A that does not register callbacks. - public IChangeToken Watch(string? filter) => NullChangeToken.Singleton; + public IChangeToken Watch(string filter) => NullChangeToken.Singleton; } }