c# - 带有可选参数的扩展方法中的方法解析

标签 c# .net extension-methods resolution optional-parameters

我有以下几个扩展方法,它们在同一个命名空间和程序集中:

public static class DateTimeExtensions
{
    public static string NullSafeToString(this DateTime? possiblyNullDateTime, string format, string nullString = "")
}

public static class NullableExtensions
{
    public static string NullSafeToString<T>(this Nullable<T> nullable, string nullString = "") where T : struct
}

我的问题是关于方法解析的。以下调用(来自另一个 namespace )解析为 ObjectExtensions.NullSafeToString当我期待 DateTimeExtensions.NullSafeToString :

DateTime? dateTime;
// ...
dateTime.NullSafeToString("yyyyMMdd");

DateTimeExtensions.NullSafeToString 中删除可选参数使其按预期解决。

C# 规范的第 7.6.5.2 节概述了搜索命名空间的顺序,但由于以上内容在同一命名空间中,我希望它使用第 7.6.5.1 节中的规则。

我认为它会匹配 DateTimeExtensions.NullSafeToString因为:

  • 尽管它们的第一个参数类型都是 Nullable<DateTime> ,我认为首先会考虑非泛型方法(即没有类型参数)。
  • 我虽然会先考虑参数列表而不考虑它们的可选参数

任何人都可以澄清为什么选择 ObjectExtensions.NullSafeToStringDateTimeExtensions.NullSafeToString

(旁白:从这里的其他讨论来看,我怀疑有些人可能不赞成使用扩展方法语义来使取消引用空值安全,但我发现将其用于像这样的有限场景,它们可以使代码更具可读性。另外我知道 Nullable.ToString 已经是 null 安全的,因为 Nullable 对象本身不是 null,但这不适合包含的 ToString 的参数,我发现显式命名的方法表明 null 安全的意图.)

最佳答案

您的问题与扩展方法无关。这是关于重载决议和可选参数。(7.5.3 c#规范的重载决议) 你可以试试这段代码

public static string NullSafeToString(DateTime? possiblyNullDateTime, string format, string nullString = "")
    {
        return string.Empty;
    }
    public static string NullSafeToString<T>(Nullable<T> nullable, string nullString = "") where T : struct
    {
        return string.Empty;
    }
    static void Test()
    {
        DateTime? datetime = DateTime.Now;
        NullSafeToString(datetime, "yyyyMMdd");
    }

关于c# - 带有可选参数的扩展方法中的方法解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10751624/

相关文章:

c# - 如何使用 C# 从套接字检索 Java 数据?

c# - 在字符串列表中查找所有整数

C# 从 Windows Azure 存储下载返回空文件,没有任何异常

c# - C#中如何清除 ListView 中的数据

.net - 运行 Windows 应用程序的 Docker

c# - .NET Micro Framework 的扩展方法

C# 扩展方法不适用于递增和递减场景,是设计使然吗?

c# - 强类型属性访问的扩展方法

c# - 如何使用 c#、mvc 中的模型值设置内联 css 宽度

c# - 使用文本框数据检查单选按钮