,我有以下几个扩展方法,这是在同一个命名空间和装配:方法分辨率可选参数
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
? (另外:从这里的其他讨论,我怀疑有些人可能会不赞成使用扩展方法语义来使解引用无效,但我发现用于这种有限的场景,它们使更多的可读代码。我知道Nullable.ToString
已经是空安全的,因为Nullable
对象本身不是空的,但并不满足参数所包含ToString
,并且我发现,明确命名方法指示空安全的目的。)
重载解析适用“少参数==更好”。 –