我有以下几个扩展方法,它们位于相同的命名空间和程序集中:
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
}
我的问题是关于方法解析。以下调用(来自另一个命名空间)解析为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.NullSafeToString
吗DateTimeExtensions.NullSafeToString
?
(除此之外:从这里的其他讨论中,我怀疑有些人可能不赞成使用扩展方法语义来使解除引用 null 安全,但我发现用于像这样的有限场景,它们使代码更具可读性。我也知道Nullable.ToString
已经空安全,因为Nullable
对象本身不是空的,但这不适合所包含的参数ToString
,而且我发现显式命名的方法表明了空安全意图。)