Почему я должен копировать «this» при использовании LINQ в структуре (и это нормально, если я это сделаю)?
Код ниже содержит простой запрос LINQ внутри неизменяемой структуры.
struct Point
{
static readonly List NeighborIndexes;
//and other readonly fields!
public IEnumerable GetEdges()
{
return from neighborIndex in NeighborIndexes;
select GetEdge(neighborIndex);
}
}
Это не компилируется.
Анонимные методы, лямбда-выражения и выражения запросов внутри структур не могут получить доступ к членам экземпляра 'этот', Подумайте о копированииэтот' к локальной переменной за пределами анонимного метода, лямбда-выражения или выражения запроса и использования вместо этого локального.
Кто-нибудь знает, почему это не разрешено?
Исправление, которое предлагает сообщение, работает нормально:
public IEnumerable GetEdges()
{
var thisCopy = this;
return from neighborIndex in NeighborIndexes;
select thisCopy.GetEdge(neighborIndex);
}
Но это стандартная практика? Есть ли причины для того, чтобы в структурах не было подобных запросов? (В более широком смысле создание копии не беспокоит меня по производительности).