Разрешение методов в методах расширения с необязательными параметрами

У меня есть следующая пара методов расширения, которые находятся в том же пространстве имен и сборке:

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приводит к тому, что он разрешается должным образом.

Раздел 7.6.5.2 спецификации C# описывает порядок поиска в пространствах имен, но, поскольку приведенные выше находятся в одном и том же пространстве имен, я ожидаю, что будут использоваться правила из раздела 7.6.5.1.

Я так и думал. d соответствует DateTimeExtensions.NullSafeToString, потому что:

  • Хотя они оба будут иметь первый тип параметра Nullable, я подумал, что это необобщенный метод (т.е. без типа параметр) будет рассматриваться в первую очередь.
  • Хотя списки параметров будут сначала рассматривается без их необязательных параметров

Может ли кто-нибудь объяснить, почему он выбирает ObjectExtensions.NullSafeToStringвместо DateTimeExtensions.NullSafeToString?

(Кроме того: из других обсуждений здесь я подозреваю, что некоторые люди могут не одобрить использование семантики метода расширения, чтобы сделать разыменование нулевым безопасным, но я считаю, что использование для ограниченных сценариев, таких как этот, делает код более читаемым. Также я знать, что Nullable.ToStringуже является нулевым, потому что сам объект Nullableне является нулевым, но это не обслуживает параметры для содержащегося ToString, и я обнаружил, что метод с явным названием указывает на намерение защиты от нулей.)

6
задан Giles 25 May 2012 в 09:12
поделиться