Несовместимый синтаксис c #? - PullRequest
7 голосов
/ 16 апреля 2010
private string[] GetRoles()
{
    string[] foo = {"Test"};
    return foo;       
}

Выше компилируется, но ...

private string[] GetRoles()
{
    return {"Test"};        
}

Нет.

Замена на:

return new string[] { "Test" };    

Очевидно, скомпилируется. Это несоответствие, или я глупый, или я просто неправ: S.

Ответы [ 5 ]

5 голосов
/ 16 апреля 2010

Относится к @Luke:

Первый пример - это просто сокращенный синтаксис инициализации массива. Второй пример - просто недопустимый синтаксис C #.

3 голосов
/ 16 апреля 2010

Объект массива должен быть создан до того, как вы вернётесь как значение. Поэтому

return new string[]{"Test"};

Дайте вам правильный тип возврата.

2 голосов
/ 16 апреля 2010

Ваш фрагмент не работает по той же причине, что приведенный ниже код не работает (так как in не компилируется)

private string[] GetRoles()
{
    //string[] foo = {"Test"};
    var foo = {"Test"};
    return foo;       
}

в вашем первом фрагменте, string[] дает компилятору достаточно информации, чтобы позволить сахару функционировать

1 голос
/ 16 апреля 2010

Исторически вам приходилось писать new оператор. Как это:

string[] foo = new string[] {"Test"};

Я думаю, что в C # 2.0 стало возможным опустить оператор new и написать просто:

* +1007 *

где компилятор может выяснить, что вы инициализируете массив. И я думаю, что согласен с вами, что это несоответствие. Когда была добавлена ​​возможность опустить оператор new, они, вероятно, забыли об операторе возврата, поскольку очень редко можно вернуть массив, который был инициализирован внутри оператора возврата. Потому что, когда компилятор смотрит на тип возвращаемого значения, он должен иметь возможность выяснить это так же, как и в случае присваивания.

Лично я никогда не опускаю оператор new, поэтому я даже не думал об этом:)

0 голосов
/ 16 апреля 2010
private string[] GetRoles()
{
    string[] foo = {"Test"};
    return foo;       
}

В приведенном выше примере вы создаете новый массив string [], а затем инициализируете его одним элементом с именем «Test».

private string[] GetRoles()
{
    return {"Test"};        
}

В этом примере вы создали метод, который ожидает вернуть массив строк. Однако вы ни в коем случае не создаете объект new string array [] *. Прежде чем вы сможете добавить элементы в массив, вам нужно сначала создать его. В основном вы пытаетесь вернуть элементы из несуществующего массива, поэтому он не работает. * +1007 *

Можно утверждать, что компилятор может создать массив для вас, но он не делает это в вашем первом примере, так зачем ожидать, что он сделает это во втором?

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