Подтвердить что ты не робот

Разрешение стандартного метода С# не выполняется с неоднозначной ошибкой вызова

Предположим, что я определил два несвязанных типа и два метода расширения с одинаковыми сигнатурами, но с разными типами фильтров:

public class Foo {}
public class Bar {}

public static class FooExtensions
{
    public static TFoo Frob<TFoo>(this TFoo foo) where TFoo : Foo { }
    public static TFoo Brob<TFoo>(this TFoo foo) where TFoo : Foo { }
}

public static class BarExtensions
{
    public static TBar Frob<TBar>(this TBar bar) where TBar : Bar { }
}

Тогда, когда я пишу new Foo().Frob();, я получаю сообщение об ошибке

error CS0121: The call is ambiguous between the following methods or properties: 'FooExtensions.Frob<TFoo>(TFoo)' and 'BarExtensions.Frob<TBar>(TBar)'

Может кто-нибудь объяснить, почему это не удается и как его избежать?

EDIT: Это происходит в VS2015 Update 3 и VS2017 RC.

EDIT2: Идея здесь заключается в том, чтобы иметь свободный API, который работает в иерархии классов:

new Foo()
  .Frob()
  .Brob()
4b9b3361

Ответ 1

Ограничение параметра типового типа не является частью сигнатуры метода. Эти два метода по существу одинаковы с точки зрения разрешения; когда компилятор пытается разрешить вызов, он видит два допустимых метода и не имеет возможности выбрать лучший, поэтому вызов помечен как неоднозначный.

Подробнее об этой проблеме можно прочитать здесь.