2010-12-01 25 views
5

tengo una estructura (.NET 3.5):¿Asignar una lista de valores a una estructura en C#?

struct ColumnHeadings 
     { 
      public string Name ; 
      public int Width ; 
     } ; 

Y cuando trato de asignar una lista de valores para que struct consigo un 'no se puede convertir implícitamente el tipo string/int para ...':

private void doSomething() 
{ 
    ColumnHeadings[,] ch = new ColumnHeadings[,]{{"column1",100}, 
       {"column2",100},{"column3",100}}; 
} 

¿Pueden los valores de estructura asignarse de la misma manera que una matriz multidimensional? ¿O tengo que asignar los valores usando ?:

ch.Name = "column 1"; 

ACTUALIZACIÓN:

Gracias a una excelente respuesta de Marc la solución correcta es:

Struct:

struct ColumnHeadings 
     { 
      private readonly string name; 
      private readonly int width; 
      public string Name { get { return name; } } 
      public int Width { get { return width; } } 
      public ColumnHeadings(string name, int width) 
      { 
       this.name = name; 
       this.width = width; 
      } 
     } 

Luego, en el método:

var ch = new[]{new ColumnHeadings("column1",100), 
      new ColumnHeadings("column2",100), 
      new ColumnHeadings("column3",100)}; 

Y el link explica por qué las estructuras de mutuable no son una buena idea.

+0

Por curiosidad, ¿por qué es 'ColumnHeadings' de dos dimensiones? –

+0

@ C. Ross - es 2D debido a intentar combinar matrices/estructuras ... :) –

+0

una matriz 2D debe contener datos homegenus; esto es realmente una matriz de 1 dimensión donde cada elemento tiene 2 valores - muy diferente –

Respuesta

7

primer lugar, que probablemente no debería haber un structen absoluto

La sintaxis será:

ColumnHeadings[] ch = new ColumnHeadings[]{ 
    new ColumnHeadings{Name="column1",Width=100}, 
    new ColumnHeadings{Name="column2",Width=100} 
}; 

Sin embargo, tendrá además la emisión de campos públicos, y el hecho de que esta es una estructura mutable, ambas son peligrosas. No realmente.

me gustaría añadir un constructor:

var ch = new []{ 
    new ColumnHeadings("column1", 100), 
    new ColumnHeadings("column2", 100) 
}; 

con:

struct ColumnHeadings 
{ 
    private readonly string name; 
    private readonly int width; 
    public string Name { get { return name; } } 
    public int Width { get { return width; } } 
    public ColumnHeadings(string name, int width) 
    { 
     this.name = name; 
     this.width = width; 
    } 
} 
+0

+1, pero sugiere agregar un encabezado 1 de "No hacer eso" :) –

+0

Esto tiene mucho más sentido, pero el suyo es múltiple dimensional. ¿Cómo funcionaría con una matriz de 2 d? –

+0

@CRoss - vea mi comentario sobre la pregunta; el 2-d es, IMO, un error –

Cuestiones relacionadas