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.

Était-ce utile?

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 de new 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top