2010-10-20 12 views
8

como en:¿Puede una propiedad/campo de clase ser de tipo anónimo en C# 4.0?

public class MyClass { 

    private static var MyProp = new {item1 = "a", item2 = "b"}; 

} 

Nota: Lo anterior no se compila ni trabajan (el var no se puede utilizar allí), que es sólo para mostrar mi punto.

actualización: Solo para aclarar la cuestión, ya había intentado usar

private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 

y esto funciona, pero no genera intelisense debido a la tipado dinámico. Soy consciente de que la escritura anónima es solo un truco de compilación, así que esperaba poder usar este truco para mi ventaja al declarar un campo estructurado sin tener que declarar una clase de antemano (principalmente porque solo va a haber una instancia de este tipo particular de campo). Puedo ver ahora que no es posible, pero no estoy seguro de por qué es así. Si el compilador simplemente está generando un tipo implícito para un objeto anónimo, debería ser bastante simple hacer que el compilador genere este tipo implícito para un campo.

+1

'MyProp' no es una propiedad, es un campo – Greg

+0

@Greg: Allí, lo arreglé para Diego (y usted): P –

+0

@Andrew - ¡Me siento tan aliviada, gracias! – Greg

Respuesta

5

No, ningún miembro debe ser un establecimiento inflexible.

Sin embargo, puede optar por el tipo dinámico para que su miembro tenga la oportunidad de ser evaluado en tiempo de ejecución.

Editar: Los miembros se deben escribir explícitamente.

+1

var está fuertemente tipado. Creo que lo que quieres decir es "escrito explícitamente". – MarkPflug

+0

@Mark Sí, var no se puede usar como miembro para una clase. – abhishek

9

Parece que podría estar haciendo una o dos preguntas, así que intentaré abordarlas ambas.

Puede un campo de clase de ser inflexible de tipos a un tipo anónimo

Nº anónimos nombres de tipos no pueden ser expresadas en código C# (de ahí el anonimato). La única forma de escribirlas de forma estática es

  1. tipo genérico inferencee
  2. uso de la palabra clave var

Ninguno de estos son aplicables al campo de un tipo.

¿Se puede inicializar un campo de clase con una expresión de tipo anónima?

Sí. El campo sólo tiene que ser declarado un tipo compatible con los tipos anónimos: object por ejemplo

public class MyClass { 
    private static object MyProp = new {item1 = "a", item2 = "b"}; 
} 
+3

Err ... ¿así que la respuesta no es "sí", sino "no"? –

+0

@ Adam la respuesta es que la pregunta es ambigua :) Trataré de hacer que mi respuesta sea menos tan – JaredPar

+0

Sí ... Tanto el objeto como la dinámica no dan un miembro anónimo. Entonces la respuesta debería ser no. – abhishek

0

No, los tipos anónimos no pueden exponerse fuera de su función de declaración de ninguna otra manera que object. Si bien el tipo anónimo es simplemente azúcar sintáctica y, de hecho, crea un tipo concreto, este tipo nunca se conoce (ni está disponible) para el desarrollador y, por lo tanto, no se puede usar.

+2

Dices "nunca conocido" y "no se puede usar", pero ¿no estás descartando la reflexión y el "dinámico"? (No es que esté fomentando la práctica, téngalo en cuenta). –

+0

@Anthony: No, ninguno de los dos permite que el desarrollador (como en, la persona que escribe el código) "sepa" el tipo. Ciertamente puede llamar a 'GetType()' en el objeto, pero esa es una operación de solo tiempo de ejecución. Tampoco es 'dinámico' una solución. –

2

Si esto es C# 4, busque en la palabra clave dinámica.

public class MyClass 
{ 
    private static dynamic MyProp = new {item1 = "a", item2 = "b"}; 
} 

Sin embargo, tan pronto como se hace esto se pierde cualquier tipo de compilador comprueba prácticos seguridad de tipos y.

+1

Eso es lo que hice, pero perdí intelizencia en las propiedades del objeto. Me gustaría hacerlo para que intellisense pueda ayudar a las personas que usan mi clase. – Diego

2

¿Qué tal si usas Tuple<string, string>?

public class MyClass { 

    private static Tuple<string, string> MyProp = Tuple.Create("a", "b"); 

} 
+1

Estaba a punto de proporcionarme este bloque de código exacto. Explícitamente está tipificado estáticamente, y no tiene que construir manualmente un nuevo tipo. Realmente espero que esto se eleve antes que esas tontas soluciones "dinámicas". – MarkPflug

+0

Por supuesto, ahora que su respuesta fue atacada probablemente no sea probable. – MarkPflug

+0

Hehe, oh bueno. No está necesariamente claro de todos modos de la pregunta que una Tuple sería una buena solución. El código de ejemplo solo tiene los campos "item1" y "item2", pero quizás el código real tenga más nombres lógicos, que se perderían al usar un Tuple. Dado que este es un campo privado, un Tuple probablemente esté bien, pero si se tratara de un campo público, probablemente diría que una mejor idea es definir un tipo específico para almacenar estos datos, a pesar de que es un poco más de codificación. –

1

Una propiedad (o campo) de una clase llamada no puede tener un tipo anónimo, porque tal tipo no puede ser mencionado en el código. Sin embargo , un tipo anónimo puede contener propiedades de tipo anónimo:

var myObj = new 
{ 
    Foo = new { Name = "Joe", Age = 20 } 
}; 

Pero tal construcción no tiene ningún uso práctico fuera del ámbito local ...

Cuestiones relacionadas