Quelle est la qualité de l'inférence de type C #?
-
20-08-2019 - |
Question
Quelle est la qualité de l'inférence de type C #? J'ai lu quelque part que ce n'est que pour les variables locales? Cela fonctionne-t-il pour les attributs de niveau de classe? Pour les signatures de méthode? Types de retour de méthode? etc.
La solution
Il existe quelques types principaux d'inférence de type en C #:
-
Variables locales typées implicitement:
- Uniquement pour les variables locales
- Uniquement lorsque la valeur est affectée dans la déclaration
- La valeur ne peut pas être nulle
- La valeur ne peut pas être une expression lambda, une méthode anonyme ou un groupe de méthodes (sans transtypage)
- Le type de compilation de la valeur est utilisé pour le type de la variable
- Toutes les autres utilisations de la variable sont uniquement vérifiées par rapport au type déterminé par la déclaration initiale + l'affectation; ils ne contribuent pas à l'inférence elle-même.
-
Inférence d'argument de type de méthode générique, c'est-à-dire que vous ne spécifiez pas les arguments de type dans un appel à une méthode générique, le compilateur les calcule en fonction des arguments.
- Ce serait très pratique d'avoir ceci pour les types génériques ainsi que pour les méthodes génériques
- Très pratique quand même - LINQ serait difficile ou impossible à utiliser sans lui
- Les types anonymes seraient pratiquement inutiles sans lui
- Règles vraiment compliquées, même la spécification est fausse à quelques endroits
-
Inférence de type de paramètre d'expression lambda
- Le compilateur tente de définir les types de paramètres des expressions lambda en fonction du contexte dans lequel ils sont utilisés
- Généralement, cela fonctionne plutôt bien, selon mon expérience
-
Inférence de type tableau, par exemple.
new[] { "Hi", "there" }
au lieu denew string[] { "Hi", "there" }
- Diverses petites restrictions, rien de majeur
J'ai probablement oublié d'autres fonctionnalités que l'on pourrait appeler & "type inference &"; Je suppose que le premier vous intéresse principalement, mais les autres pourraient vous intéresser aussi:)
Autres conseils
Il ne peut être utilisé que pour les variables locales, mais il peut détecter le type sous différentes formes.
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
EDIT: Un autre exemple de Tye Inference concerne 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.
Cela fonctionne uniquement avec les variables locales telles que je les comprends.