Угловой случай использования лямбда-выражения в базовом конструкторе
В платформе, которую мы строим, нам нужен следующий шаблон:
public class BaseRenderer
{
Func renderer;
public BaseRenderer(Func renderer)
{
this.renderer = renderer;
}
public string Render()
{
return renderer();
}
}
public class NameRenderer : BaseRenderer
{
public string Name{ get; set; }
public NameRenderer ()
: base(() =>this.Name)
{}
}
Как видите, мы создаем лямбду при вызове базового конструктора.
public class Program
{
public static void Main()
{
Console.WriteLine(new NameRenderer(){Name = "Foo"}.Render());
}
}
Как ни странно, при попытке фактически использовать лямбда-выражение оно выдает NullReferenceException (консольное приложение) или какое-либо исключение ExecutionEngineExceptionException (веб-приложение на IIS).
Я думаю, причина в том, что этот указатель не готов до вызова базового конструктора, поэтому лямбда не может перехватитьthis.Name
на данном этапе.
не должен»это исключение в "время захвата " вместо "время исполнения"? Это поведение задокументировано?
Я могу изменить код по-другому, но я думаю, что это стоит комментариев.