net - ¿Por qué `this` no está disponible en C#6.0 Auto-Property Initialization?
properties in c# with example (2)
¿Por que es esto entonces? ¿El Inicializador de propiedades automáticas no se traduce realmente en el código del constructor en IL?
Las reglas para los inicializadores de propiedad implementados automáticamente son las mismas que las de los inicializadores de campo, por el mismo motivo. Tenga en cuenta que los inicializadores de propiedades se ejecutan antes que los cuerpos de clase base, al igual que los inicializadores de campo, por lo que aún se encuentra en el contexto de un objeto "algo no inicializado"; más que durante un cuerpo de constructor.
Así que debes imaginar que la propiedad se está convirtiendo en esto:
private readonly Nested bar = new Nested(this); // Invalid
public Nested Bar
{
get { return bar; }
}
En resumen, esta restricción es para evitar que usted se meta en problemas. Si necesita referirse a this
al inicializar una propiedad, simplemente hágalo manualmente en un constructor, como se muestra en el segundo ejemplo. (Es relativamente raro en mi experiencia.)
Tengo la siguiente clase de código:
public class Foo
{
public Nested Bar { get; } = new Nested(this);
public class Nested
{
public Nested(Foo foo)
{
foo.DoSomething();
}
}
private void DoSomething()
{
}
}
Sin embargo, me sale este error de compilación:
La palabra clave ''esto'' no está disponible en el contexto actual
Puedo solucionarlo simplemente no utilizando el Auto-Property Initializer, y moverlo explícitamente a un constructor en su lugar:
public Nested Bar { get; }
public Foo()
{
this.Bar = new Nested(this);
}
¿Por que es esto entonces? ¿El Inicializador de propiedades automáticas no se traduce realmente en el código del constructor en IL?
Simplemente: no puedes usar this
en los inicializadores. La idea es evitar que se escape un objeto incompleto: Nested(this)
podría hacer cualquier cosa a su objeto, lo que lleva a errores muy confusos y difíciles de entender. Tenga en cuenta que los inicializadores se ejecutan antes que cualquier constructor que agregue. Lo mismo también falla para los inicializadores de campo, exactamente de la misma manera:
private Nested _field = new Nested(this);
Esencialmente, los inicializadores están diseñados para realizar inicializaciones simples , solucionando el problema del 98%. Todo lo relacionado con this
es más complejo, y deberá escribir su propio constructor, y responsabilizarse de cualquier problema de tiempo :)