2009-01-26 9 views
16

¿Qué tan bueno es la inferencia tipo C#? Leí en alguna parte que es solo para variables locales ¿Funciona para los atributos de nivel de clase? Para firmas de métodos? ¿Tipos de devolución de método? etc.¿Qué tan buena es la inferencia tipo C#?

Respuesta

36

Hay algunas clases principales de la inferencia de tipos en C#:

  • variables locales Implícitamente proporcionado:

    • Sólo para las variables locales
    • Sólo cuando el valor se asigna como parte de la declaración
    • El valor no puede ser nulo
    • valor no puede ser una expresión lambda, método anónimo o grupo método (sin una conversión)
    • El tipo de tiempo de compilación del valor se utiliza para el tipo de la variable
    • Cualquier usos adicionales de la variable sólo se comprueban contra el tipo determinado por la declaración + asignación inicial; ellos no contribuyen a la inferencia en sí misma.
  • Inferencia de argumento de tipo de método genérico, es decir, no especifica los argumentos de tipo en una llamada a un método genérico, el compilador los calcula en función de los argumentos.

    • sería muy útil tener esto para los tipos genéricos, así como los métodos genéricos
    • Realmente útil de todos modos - LINQ sería difícil o imposible de usar sin ella
    • tipos
    • anónimos serían bastante inútil sin ella
    • reglas realmente complicado, incluso la especificación está mal en algunos lugares
  • Lambda tipo de parámetro de expresión inferencia

    • compilador intenta resolver los tipos de los parámetros para las expresiones lambda en función del contexto en el que se utiliza
    • por lo general funciona bastante bien, en mi experiencia
  • tipo de matriz de inferencia, por ejemplo,new[] { "Hi", "there" } en lugar de new string[] { "Hi", "there" }

    • Varias pequeñas restricciones, nada importante

Probablemente he olvidado algunas otras características que podrían llamarse "inferencia de tipos". Sospecho que en su mayoría está interesado en el primero, pero los demás también pueden ser relevantes para usted :)

1

Funciona solo con variables locales, tal como lo entiendo.

7

Solo se puede usar para variables locales, pero puede detectar el tipo en muchas formas diferentes.

var myVar = SomeMethodThatReturnsInt(); //will know it's an int 
var myIntList = new List<int>(); //this works too (although this is technically not type inference) 
var myOwnVar = new { Name = "John", Age = 100 }; // will create own type and infer that 

EDITAR: Un ejemplo más de Tye Inference es con Lambdas. IE:

var myList = new List<int>(); 
//add some values to list 

int x = myList.Find(i => i == 5); // compiler can infer that i is an int. 
+3

¿Por qué el segundo ejemplo no es técnicamente inferencia tipo? –

+0

+1 a Rafa Castaneda. ¿Por qué el segundo ejemplo no es un ejemplo de inferencia de tipo? ciertamente me parece a mí! – TheIronKnuckle

Cuestiones relacionadas