2010-12-14 25 views
7

Utilizando este código:Constructor C# Struct Genérico

struct Foo<T1> 
{ 
    public T1 Item1 { get; private set; } 

    public Foo(T1 item1) 
    { 
     Item1 = item1; 
    } 
} 

me encuentro con este error:

Backing field for automatically implemented property 'Foo.Item1' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

Mi pregunta es, ¿por qué es la propiedad Item1 no asignado totalmente después del constructor se llama?

Editar: Cambió set a private set porque esta pregunta no tiene nada que ver con la mutabilidad.

+10

No haga estructuras mutables, por favor. –

+0

¿Por qué no debería? Eso realmente hace que las cosas sean mucho más simples a veces, y puede mejorar bastante el rendimiento en algunos casos de bucle intensivo. ¿Qué pasa con las estructuras mutables? (Eso tampoco responde a su pregunta.) – Mehrdad

+0

@Lambert http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil –

Respuesta

15

Añadir this() aquí:

public Foo(T1 item1) : this() 
{ 
    Item1 = item1; 
} 

Es porque va a asignar a una propiedad, y el compilador no puede deducir que la propiedad única asigna un valor a una variable; podría hacer otras cosas antes de que la instancia se inicialice, y eso no está permitido porque la estructura podría tener datos basura. Entonces primero debe inicializarlo con el constructor predeterminado y luego hacer lo que quiera.

+0

@Lambert: la pregunta es, ¿por qué no puede el compilador de ver lo obvio? El compilador hace un buen trabajo de análisis de flujo en otros casos. – Vlad

+0

No hice el compilador, entonces no sé. :) Pero evita otras situaciones en las que la propiedad no se autogenera y donde intenta utilizar datos basura. Además, creo que es probable que sea un problema CLR, no un problema del compilador: el JIT puede quejarse si intenta acceder a una propiedad antes de que la instancia se inicialice, ya que no tiene la información que el compilador tiene inmediatamente disponible para eso. – Mehrdad

+0

También puede ser capaz de resolver esto implementando explícitamente su propio constructor predeterminado. –