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

Инициализация инициализации и конечная запятая

void Main()
{
    Test t = new Test
    {
        A = "a",
        B = "b", // <-- erroneous trailing comma
    };
}

public class Test
{
    public string A { get; set; }
    public string B { get; set; }
}

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

4b9b3361

Ответ 1

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

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

Например, ECMAScript (JavaScript) вначале молчал об этой проблеме, и поэтому, естественно, некоторые реализации (SpiderMonkey в Firefox, Opera JavaScript и т.д.) допускали их, в то время как другие (Microsoft JScript) этого не делали. И это привело к тому, что "почему эта работа не работает в IE" здесь и в другом месте. (К счастью, ECMAScript 5 явно их разрешает, и IE8, наконец, поддерживает их в инициализаторах объектов - IE8 по-прежнему обрабатывает инициализаторы массивов нестандартным способом, хотя, честно говоря, болтающаяся запятая для них была разъяснена только в ECMAScript 5).

Вы также найдете это во многих других местах в грамматике С#, например, перечисления и инициализаторы массивов.

Ответ 2

Я думаю, что это позволило упростить автоматическое создание кода.

В этом случае у вас может быть какая-то программа, создающая такой код

...
for( char c = 'A'; c < 'Z'; c++ )
{
   AddToOutput( c + " = \"+c.ToLower()+"\"," );
}
...

И не нужно заботиться об удалении последней конечной запятой.

Ответ 3

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

Это на самом деле довольно распространено в инициализации списка/массива на других языках (Python, Ruby, Haskell приходят на ум).