Встроенная инициализация свойства и запятая - PullRequest
18 голосов
/ 09 марта 2011
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; }
}

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

Ответы [ 3 ]

17 голосов
/ 09 марта 2011

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

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

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

Это встречается и во многих других местах грамматики C #, например, перечисления и инициализаторы массива.

6 голосов
/ 09 марта 2011

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

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

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

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

5 голосов
/ 09 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...