Посмотрите, что у вас внутри вызовов методов Select
и ForEach
:
options.Attributes[i] = new EntityCodeKey
{
EntityCode = objEntityCode[i].EntityCodes
, OrganizationCode = Constants.ORGANIZATION_CODE
};
Это, по сути, Action<int>
- то есть код, который делает что-то, но не возвращает что-то. Вот почему это имеет смысл в ForEach
, но не Select
- Select
ожидает (в данном случае) Func<int, T>
- код, который возвращает что-то (некоторого типа T
) , Так как вы просто присваиваете Attributes[i]
новому EntityCodeKey
, этот код не попадает в рамки того, что вы обычно находите в вызове Select
.
Обратите внимание, что технически , приведенный выше код на самом деле будет возвращать что-то, а именно значение, хранящееся в options.Attributes[i]
, если вы удалите точку с запятой с конца. Зачем? Две причины:
- Лямбда-выражение из одной строки (не заканчивающееся точкой с запятой) возвращает то, к чему оно относится. Вот почему что-то вроде
person => person.Name
может фактически интерпретироваться как Func<Person, string>
.
- Операция присваивания оценивается как присвоенное значение. Вот почему вы можете написать
x = y = z
- потому что y = z
фактически переходит в новое присвоенное значение y
.
Так что это правда: ваш код без точки с запятой на самом деле оценивается как options.Attributes[i]
. Но написание кода таким способом было бы, на мой взгляд, довольно запутанным.