c# .net type-inference

¿Qué tan bueno es la inferencia tipo C#?



.net type-inference (3)

¿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.


Funciona solo con variables locales tal como lo entiendo.


Hay algunos tipos principales de inferencia de tipo en C #:

  • Variables locales implícitamente tipadas:

    • Solo para variables locales
    • Solo cuando el valor se asigna como parte de la declaración
    • El valor no puede ser nulo
    • El valor no puede ser una expresión lambda, método anónimo o grupo de métodos (sin un molde)
    • El tipo de valor de tiempo de compilación se utiliza para el tipo de la variable
    • Cualquier uso adicional de la variable solo se compara con 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 realmente útil tener esto para tipos genéricos y métodos genéricos
    • Realmente útil de todos modos: LINQ sería difícil o imposible de usar sin él
    • Los tipos anónimos serían bastante inútiles sin
    • Reglas realmente complicadas, incluso las especificaciones son incorrectas en algunos lugares
  • Inferencia del tipo de parámetro Lambda expresión

    • El compilador intenta calcular los tipos de 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
  • Inferencia de tipo de matriz, por ejemplo, new[] { "Hi", "there" } 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 tipo". Sospecho que en su mayoría está interesado en el primero, pero los demás también podrían ser relevantes para usted :)


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. ES DECIR:

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.