Lambda expressions are not allowed in field initialization

С чем связано ограничение

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);
  }
}

. Полезно может быть к примеру, тогда, когда требуется полю назначить какой-нибудь делегат по-умолчанию.

Ну, делегат можно назначить и не_анонимной функцией. То есть расписать лямбду как метод.

Не спорю, что это возможно. На мой взгляд, один из основных плюсов данного нововведения - разграничение инициализации полей-делегатов и остальных частей объекта. Я имею ввиду, что сейчас при данном запрете инициализацию таких полей надо производить, например, в конструкторе. Это в некоторой степени засоряет код конструктора. При снятии ограничения будет возможность провести инициализацию таких полей отдельно - при объявлении, оставив код конструктора, например, более чистым.

1 лайк

А по моему вы всё же не поняли… Конструктор тут не при чём:

type
  t1=class
    
    public procedure p1 := exit;
    
    public p:procedure := p1;//можно без лямбды и без конструктора
    
  end;

begin end.

Хотя с тем, что это засоряет код я таки согласен…

Кстати, инициализация полей вне конструктора существует не для того чтоб его разгрузить. А для отсутствия дублирования кода. Если 1 переменная заполняется одинаковым значением во всех конструкторах.

1 лайк

Это разгрузка конструктора в некотором смысле.

Только как побочный эффект. Отсутствие дублирования кода нужно чтоб случайно не забыл изменить 1 дубль, когда изменяешь другой. Да и в принципе, менять в 1 месте легче чем в 10.

Согласен.

Нам не удалось устранить неоднозначности в грамматике чтобы это сделать

К примеру?
Может там можно придумать как сделать, если взглянуть под свежим/нестандартным углом. Объясните что именно не так, пожалуйста.

Можно поподробнее с этого момента?