Caso de esquina ao usar a expressão lambdas no construtor de base
Na estrutura que estamos construindo, precisamos do seguinte padrão:
public class BaseRenderer
{
Func<string> renderer;
public BaseRenderer(Func<string> renderer)
{
this.renderer = renderer;
}
public string Render()
{
return renderer();
}
}
public class NameRenderer : BaseRenderer
{
public string Name{ get; set; }
public NameRenderer ()
: base(() =>this.Name)
{}
}
Como você vê, criamos um lambda ao chamar o construtor de base.
public class Program
{
public static void Main()
{
Console.WriteLine(new NameRenderer(){Name = "Foo"}.Render());
}
}
Estranhamente, ao tentar realmente usar o lambda, ele lança NullReferenceException (Console Application), ou algum tipo de ExecutionEngineExceptionexception (aplicativo da Web no IIS).
Eu acho que a razão é que este ponteiro não está pronto antes de chamar o construtor base, então o lambda é incapaz de capturarthis.Name
nesta fase.
Não deveria lançar uma exceção em "tempo de captura" em vez de "tempo de execução"? Esse comportamento é documentado?
Eu posso refatorar o código de uma maneira diferente, mas acho que vale a pena um comentário.