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

Ошибка конструктора С# ошибка компилятора CS0122 против CS1729

① В следующем коде С# возникает CS1729, но я понимаю, что CS0122 будет более подходящим.

namespace A
{
  class Program
  {
    static void Main()
    {
      Test test = new Test(1);
    }
  }
  class Test
  {
    Test(int i) { }
  }
}

CS1729: "A.Test" не содержит конструктор, который принимает 1 аргумент

CS0122: 'A.Test.Test(int) недоступен из-за уровня защиты

② В следующем коде С# возникает CS0122, но я понимаю, что CS1729 будет более подходящим

namespace A
{
  class Program
  {
    static void Main()
    {
      Test test = new Test();
    }
  }
  class Test
  {
    Test(int i) { }
  }
}   

CS0122: 'A.Test.Test(int) недоступен из-за уровня защиты

CS1729: 'A.Test' не содержит конструктор, который принимает 0 аргументов

Вопрос: есть ли причина, по которой CS0122 и CS1729 меняются местами в ① и ② или это ошибка компилятора С#?

P.S.: Ошибки в ① и ② могут быть воспроизведены с помощью компилятора Microsoft Visual С# 2010 4.030319.1.

4b9b3361

Ответ 1

Полное раскрытие: я работаю над командой С# в Microsoft.

Диагностическая отчетность от компилятора - сложный бизнес! Мы проводим много времени, пытаясь обеспечить, чтобы "лучшая" диагностика сообщалась для определенного условия ошибки. Однако это иногда требует учета эвристики, и мы не всегда получаем это право. В этом случае, как отмечает Хенрик Холтерман, обе ошибки являются разумными (по крайней мере, для второго случая).

Первый пример - явно ошибка, хотя и низкая. В конце концов, это все еще ошибка с несколько "правильной" (я здесь немного милостива). Во втором примере обе ошибки верны, но компилятор не смог выбрать "лучший" и, надеюсь, самый полезный диагностический.

С компилятором Roslyn С# у нас появилась возможность взглянуть на нашу диагностическую отчетность и сделать лучший выбор. Для этих конкретных примеров компиляторы Roslyn действительно вызывают ошибки, которые вы ожидали. В первом примере сообщается CS0122, а во втором случае сообщается CS1729. Таким образом, вы можете быть уверены, что это уже исправлено в будущей версии.