C # LINQ / лямбда-область вопроса - PullRequest
0 голосов
/ 28 июня 2010

Я получаю ошибку:

Локальная переменная с именем 's' не может быть заявлено в этой области, потому что это дал бы другое значение для «с», который уже используется в «ребенке» возможность обозначить что-то еще.

static void Main(string[] args)
{
    string s = "hello"; // Line 1
    var test = new[] { "abd", "def" }.Select(s => s.StartsWith("a")); // Line 2
}

Почему?

Я бы предположил, что 's' из строки 1 будет затенено объявлением '.Select (s => ..') в строке 2, но - насколько я могу судить - это не так

PS Я не уверен, что это слово заштриховало правильный термин - поправьте меня, если есть лучшее слово / фраза.

Ответы [ 3 ]

6 голосов
/ 28 июня 2010

Вы получаете ошибку по той же причине, что и в обычном блоке кода (например, , если оператор или цикл ), вы не можете объявить переменные с тем же именем, что и вне блока кода.

Это отличается от переменных класса и переменных метода, где вы можете явно ссылаться на переменные класса с помощью ключевого слова this .

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

3 голосов
/ 28 июня 2010

Дело в том, что вы уже можете ссылаться на локальную переменную s в лямбда-выражении - поэтому введение другой переменной с именем s будет довольно запутанным. Компилятор C # помогает избежать написания нечитаемого кода.

Спецификация могла бы позволить переменной "extra-local" просто скрыть локальную переменную, конечно, но я не думаю, что это было бы хорошей идеей.

1 голос
/ 28 июня 2010

Объявление string s = "hello"; объявляется вне лямбда-выражения и, следовательно, доступно из него.В результате объявление s => s.StartsWith("a") вступает в противоречие с объявлением s вне лямбда-выражения, то есть компилятор не может выяснить, на какой s вы ссылаетесь в выражении s.StartsWith("a").

.покажите проблему, рассмотрите следующий код:

static void Main(string[] args)
{
    string s = "hello"; // Line 1
    var test = new[] { "abd", "def" }.Select(x => x.StartsWith("a") && s.StartsWith("h")); // Line 2
}

Это вернет true в выборе, только если эта строка в массиве (представленная x в лямбда-выражении) начинается с "a" иСтрока s начинается с "h".

Кстати, ваш оператор будет возвращать только ICollection<bool>, а не ICollection<string>, как вы могли бы ожидать ... для возврата строк, начинающихся с "a", используйте:

new[] { "abd", "def" }.Where(x => x.StartsWith("a"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...