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