Универсальные дополнительные методы в C#: что произойдет в этом пограничном случае?

В недавнем моем вопросе я узнал, что, если существует больше чем один дополнительный метод с ограничениями, которые соответствуют данному типу, самый определенный будет выбран. Это получило меня взгляды - как компилятор определяет, какой "более конкретен"? И каков результат будет?

Скажем, у меня есть следующие классы:

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().DoSomething(), так как это "ближе" к переданному типу. То, чем я интересовался затем, было, "что делает ближе в этом среднем контексте? Как компилятор будет реагировать, если ограничения будут от двух различных цепочек наследования? Почему?"

6
задан Community 23 May 2017 в 11:57
поделиться