Nel quadro che stiamo costruendo ci serve il seguente schema:caso Corner in usando l'espressione lambda a base di costruttore
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)
{}
}
Come vedete, creiamo un lambda quando si chiama il costruttore di base.
public class Program
{
public static void Main()
{
Console.WriteLine(new NameRenderer(){Name = "Foo"}.Render());
}
}
Stranamente, quando si cerca di utilizzare effettivamente il lambda getta NullReferenceException (applicazione console), o qualche tipo di ExecutionEngineExceptionexception (app Web su IIS).
Penso che il motivo sia che questo puntatore non è pronto prima di chiamare il costruttore di base, quindi lambda non è in grado di acquisire this.Name
in questa fase.
Non dovrebbe generare un'eccezione in "tempo di acquisizione" anziché "tempo di esecuzione"? Questo comportamento è documentato?
Posso rifattorizzare il codice in un modo diverso, ma penso che valga un commento.
Questo è stato chiesto prima, verrà risolto in C# 4.0 – leppie