2011-10-11 8 views
5

he definido mi estructura como esta:Lo que está mal con la definición de este tipo de estructura

struct Test 
{ 
    private string assayName; 
    public string AssayName { get; set; } 

    private string oldUnitName; 
    public string OldUnitName { get; set; } 

    private string newUnitName; 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) 
    { 
     assayName = name; 
     oldUnitName = oldValue; 
     newUnitName = newValue; 
    } 

} 

pero me da el siguiente error:

"Error 13 Backing field for automatically implemented property 'EnterResults.frmApplication.Test.NewUnitName' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer."

+2

Para empezar: El compilador no asuma que 'assayName' es el campo respaldo para 'AssayName' ... –

+0

Sus propiedades no tienen acceso ni cambian los campos de respaldo. – canon

+1

En una nota lateral, es probable que desee utilizar una 'clase', no una' struct'. –

Respuesta

6

Bueno, hay dos cuestiones: en realidad

1. Sus utilizando las propiedades automáticas, pero luego también proporcionan campos, no hay cableado entre el dos.

2. Cuando utiliza propiedades automáticas, porque se trata de una estructura, primero deben inicializarse. Puede hacer esto con una llamada al constructor predeterminado. Por lo que una versión revisada sería:

struct Test 
{ 
    public Test(string name, string oldValue, string newValue) 
     : this() 
    { 
     AssayName = name; 
     OldUnitName = oldValue; 
     NewUnitName = newValue; 
    } 

    public string AssayName { get; private set; } 
    public string OldUnitValue { get; private set; } 
    public string NewUnitValue { get; private set; } 
} 
+0

correcto. Gracias – Bohn

6

No en realidad se está haciendo nada con las propiedades. Pruebe esto:

struct Test 
{ 
    public string AssayName { get; set; } 
    public string OldUnitName { get; set; } 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) : this() 
    { 
     AssayName = name; 
     OldUnitName = oldValue; 
     NewUnitName = newValue; 
    } 
} 

Creo que esto tiene que ver con la inicialización de estructuras. Tenga en cuenta que la llamada al constructor predeterminado que agregué parece hacerlo feliz :)

"Parece que lo hace feliz" - qué tonto es eso. Busqué la respuesta real que está vinculada a cómo se inicializan las estructuras. Llamar al constructor predeterminado asegura que los campos se inicialicen antes de que se use la estructura.

2

Está intentando crear un Automatically Implemented Property, pero está definiendo "Campos de respaldo" (que no tienen uso aparente), y luego está asignando valores a esos campos de respaldo en su constructor y dejando sus propiedades completamente intactas.

3

Puede eliminar los campos privateassayName, oldUnitName y newUnitName. A continuación, se refieren a las propiedades implementadas automáticamente en su constructor:

public Test(string name, string oldValue, string newValue) 
{ 
    AssayName = name; 
    OldUnitName = oldValue; 
    NewUnitName = newValue; 
} 
2

También puede llamar al constructor por defecto:

public Test(string name, string oldValue, string newValue) : this() 
{ 
    assayName = name; 
    oldUnitName = oldValue; 
    newUnitName = newValue; 
} 

Ver here

+0

Tenga en cuenta que no asumí que sus variables públicas y privadas estaban relacionadas (vea la respuesta de codificación de gorila) – KevinDTimm

Cuestiones relacionadas