Сравните следующее использование ForEach для создания ограничивающей рамки из содержащихся точек (Unity, но это несущественно). Один работает, другой компилируется нормально, но не получается.
Хорошо — явная лямбда:
Код: Выделить всё
Bounds ret = new(center, Vector3.zero);
endPositions.ForEach(pos => ret.Encapsulate(pos)); // endPositions is List
return ret;
Плохо — передача группы методов (я думаю):
Код: Выделить всё
Bounds ret = new(center, Vector3.zero);
endPositions.ForEach(ret.Encapsulate);
return ret;
Я ожидаю, что второй будет делать то же самое, что и первый, поскольку он ссылается на метод экземпляра. Но он просто молча оставляет ret как есть. Единственное отличие, которое я вижу, заключается в том, что во второй форме параметр ForEach представляет собой группу методов, а не конкретную перегрузку.
Набор разрешения перегрузки следующий:
Код: Выделить всё
public void Encapsulate(Vector3 point);
public void Encapsulate(Bounds bounds);
Однако из определения List.ForEach(Action) я ожидаю, что только первый метод, принимающий Vector3, будет быть пригодным. Однако похоже, что вместо этого выбран второй (принимающий границы).
Моя единственная теория заключается в том, что это связано с тем, как и где это параметр привязан, но здесь я застрял. Что именно здесь происходит?
Подробнее здесь:
https://stackoverflow.com/questions/784 ... st-foreach