В моем недавнем моем вопросе я узнал, что если существует более одного метода расширения с ограничениями, соответствующими данному типу, будет выбран наиболее конкретный. Это заставило меня задуматься - как компилятор определяет, какой из них является «более конкретным»? И каков будет результат?
Допустим, у меня есть следующие классы:
public MyClass : IComparable, IDisposable
{
// Implementation of members
}
public static class MyExtensions
{
public static void DoSomething<T>(this T item)
where T : IComparable
{ /* whatever */ }
public static void DoSomething<T>(this T item)
where T : IDisposable
{ /* whatever else */ }
}
Если я теперь использую метод расширения как
var instance = new MyClass();
instance.DoSomething();
какой метод будет использоваться? Или компилятор выдаст ошибку?
Примечание: я не говорю, что это хороший дизайн или что у меня есть случай, когда мне нужно это сделать. Но термин «более конкретный» был достаточно свободен, чтобы заставить меня задуматься над этим, и теперь я должен знать! : P
Обновление:
Я думаю, что меня не очень интересовало , что произойдет в приведенном выше примере, как в почему . Это пришло мне в голову, так как я занимался такими вещами, как
public static class CollectionExtensions
{
public static void DoSomething<T>(this T items) where T : IList { ... }
public static void DoSomething<T>(this T items) where T : IEnumerable { ... }
}
, где компилятор знает, как выбрать первый метод для new List<Something>().DoSomething()
, поскольку он "ближе" к переданному типу. Что меня тогда интересовало, так это «что означает ближе в этом контексте? Как будет реагировать компилятор, если ограничения происходят из двух разных цепочек наследования? Почему?»