Lambda expressions are not allowed in field initialization
? На мой взгляд, было бы неплохо иметь возможность сразу инициализировать поля делегатами. В C#, к примеру, следующий код проходит компиляцию:
using System;
class SomeClass<T>
{
public Action<byte> x = T => Console.WriteLine(T);
}
class MainClass
{
public static void Main(string[] args)
{
new SomeClass<byte>().x(0);
}
}
. Полезно может быть к примеру, тогда, когда требуется полю назначить какой-нибудь делегат по-умолчанию.
Не спорю, что это возможно. На мой взгляд, один из основных плюсов данного нововведения - разграничение инициализации полей-делегатов и остальных частей объекта. Я имею ввиду, что сейчас при данном запрете инициализацию таких полей надо производить, например, в конструкторе. Это в некоторой степени засоряет код конструктора. При снятии ограничения будет возможность провести инициализацию таких полей отдельно - при объявлении, оставив код конструктора, например, более чистым.
А по моему вы всё же не поняли… Конструктор тут не при чём:
type
t1=class
public procedure p1 := exit;
public p:procedure := p1;//можно без лямбды и без конструктора
end;
begin end.
Хотя с тем, что это засоряет код я таки согласен…
Кстати, инициализация полей вне конструктора существует не для того чтоб его разгрузить. А для отсутствия дублирования кода. Если 1 переменная заполняется одинаковым значением во всех конструкторах.
Только как побочный эффект. Отсутствие дублирования кода нужно чтоб случайно не забыл изменить 1 дубль, когда изменяешь другой. Да и в принципе, менять в 1 месте легче чем в 10.