Поведение методов перегрузки С# с интерфейсом

Возможный дубликат:
C# 4: конфликтующие перегруженные методы с необязательными параметрами

У меня просто есть одно небольшое исследование и создан следующий код.

namespace Test {
class Program
{
    public interface ITestA
    {
        void MethodA(int a, int b);
    }

    public class TestAClass : ITestA
    {
        public void MethodA(int a, int b)
        {
            Console.WriteLine("MethodA with param");
        }

        public void MethodA(int a, int b, bool logic = true)
        {
            Console.WriteLine("MethodA logic with param");
        }
    }

    public interface ITestB
    {
        void MethodA(int a, int b, bool logic = true);
    }

    public class TestBClass : ITestB
    {
        public void MethodA(int a, int b)
        {
            Console.WriteLine("MethodB with param");
        }         

        public void MethodA(int a, int b, bool logic = true)
        {
            Console.WriteLine("MethodB logic with param");
        }
    }

    static void Main(string[] args)
    {
        var testA = new TestAClass();
        testA.MethodA(1, 1);            
        var testB = new TestBClass();
        testB.MethodA(1, 1);   
    }
} }

У меня вопрос, почему компилятор всегда выбирает короткий метод с двумя параметрами. И конечно все это работает так же и без интерфейса.

Спасибо


person Arbejdsglæde    schedule 16.05.2011    source источник
comment
Итак, если это работает одинаково с интерфейсом и без него, зачем показывать интерфейс в вашем вопросе? Идея состоит в том, чтобы использовать минимальный объем кода, необходимый для воспроизведения поведения. Это заставляет нас сосредоточиться на фактическом вопросе, а не на несущественных деталях.   -  person Cody Gray    schedule 16.05.2011
comment
Кроме того, это наверняка не перегрузка оператора, а скорее перегрузка метода, совершенно другая вещь.   -  person Cody Gray    schedule 16.05.2011
comment
И основная проблема связана с необязательными параметрами, а не с интерфейсами.   -  person Rik    schedule 16.05.2011
comment
Если подобные темы вас интересуют, вы можете заглянуть в мой блог на этой неделе. Я веду серию статей о том, как интерфейсы и необязательные объявления аргументов работают в C#.   -  person Eric Lippert    schedule 16.05.2011


Ответы (2)


Это сводится к тому, как компилятор обрабатывает именованные и необязательные параметры.
Ознакомьтесь с эту статью в MSDN для получения дополнительной информации, особенно параграфа Разрешение перегрузки.

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

Вот почему в вашем случае компилятор выбирает метод без дополнительных параметров.

person Jakob Möllås    schedule 16.05.2011

Потому что компилятор находит метод, который идеально соответствует вызываемому методу, и использует его.
Компилятор ищет другие подходящие методы, если первый способ не работает...

person Marco    schedule 16.05.2011