2014-02-20 4 views
4

В this question, следующий класс определяются:Несоответствие компилятор ошибок неоднозначности

public class Program 
{ 
    int n = 0; 

    public void Print() 
    { 
     Console.WriteLine(n); 
    } 

    public Program() 
    { 
    } 

    public Program(int num = 10) 
    { 
     n = num; 
    } 
} 

Теперь, очевидно, вызов конструктора здесь с помощью new Program() неоднозначен из-за дополнительный параметр на втором конструкторе. При прочтении этого неясно, следует ли инициализировать n с помощью 0 или 10.

Однако:

Фактическая отчетность проблемы кажется непоследовательным. Создав этот класс и используя его, я смог использовать new Program() как на C#, так и на VB.Net, а также на .Net 4 или .Net 4.5. Все тесты проводились в VS2013.

В связанном вопросе, хотя, на самом деле OP получил сообщение об ошибке при использовании VB.Net В .NET 4 и VS2010:

«.ctor» является неоднозначным, поскольку несколько видов элементов с таким именем существует в классе 'ConsoleApplication2.Program'.

Так почему же ошибка иногда возникает, когда в другое время программа может быть успешно выполнена?

Для справки значение n, когда выполнение успешно 0.

ответ

4

Поскольку язык VB изменяется между версиями 10 и 11. В Спецификации языка версии 11, раздел 11.8.1. Правило 7-9 разрыва связи:

7.9. Если бы M не использовало необязательные параметры по умолчанию вместо явных аргументов, но N сделал, то исключить N из набора.

(Как было правила 7.8 и 7.10, но здесь неуместна)

+0

Только начинал охоту за этим в спецификации - предположил, что он должен быть где-то там, поэтому спасибо, что спасли меня! –

0

Для VS2012 и VS2013 определяется:

Разрешение перегрузки

Использование именованных и необязательных аргументов влияет разрешения перегрузки следующими способами:

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

Source

+0

Это было бы объяснить, за исключением того, что я не вижу какой-либо отличается от определения VS2010 (который является тот, который вы на самом деле связан с ним), и VS2012/2013 версии того же самого. –

+0

Эээ ... ты избил меня на несколько минут. Как я уже упоминал в своем посте, я думаю, что разница не в версиях CS20XX, но как VB и C# справляются с этим. – MrPaulch

Смежные вопросы