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

Почему это не вызывает "неоднозначную ссылочную ошибку"?

public class A
{
    public virtual string Go(string str) { return str; }
    }

public class B : A
{
    public override string Go(string str) {return base.Go(str);}
    public string Go(IList<string> list) {return "list";}
}

public static void Main(string[] args)
{
    var ob = new B();
    Console.WriteLine(ob.Go(null));
}

http://dotnetpad.net/ViewPaste/s6VZDImprk2_CqulFcDJ1A

Если я запустил эту программу, я получаю "список", отправленный на выход. Почему это не вызывает двусмысленную ошибку ссылки в компиляторе?

4b9b3361

Ответ 1

Поскольку перегрузка, берущая строку, не определена в B (только переопределяется), она имеет более низкий приоритет, чем тот, который принимает IList<string>.

Следовательно, вторая перегрузка побеждает и нет никакой двусмысленности.

Это подробно объясняется в http://csharpindepth.com/Articles/General/Overloading.aspx