2008-10-01 4 views
5

Je sais que nous ne pouvons pas faire cela au niveau de la classe, mais au niveau de la méthode, nous pouvons toujours le faire.Pourquoi ne pouvons-nous pas déclarer var a = new Liste <string> au niveau de la classe?

var myList=new List<string> // or something else like this 

Cette question m'est venue à l'esprit depuis que nous déclarons une variable comme celle-ci. Nous fournissons toujours les informations de type au RHS de l'expression. Ainsi, le compilateur n'a pas besoin de faire des devinettes. (Corrigez-moi si je me trompe).

donc pas question reste à savoir pourquoi au niveau de la classe alors que son permis au niveau de la méthode

Répondre

6

La mise en œuvre de cette fonction présente des problèmes techniques. Les cas courants semblent simples mais les cas plus sévères (par exemple, les champs référençant d'autres champs dans des chaînes ou des cycles, des expressions qui contiennent des types anonymes) ne le sont pas.

Voir Eric blog de Lippert pour une explication approfondie: Why no var on fields?

5

Les gars du compilateur juste ne pas mettre en œuvre le soutien. C'est entièrement un compilateur magique, et le compilateur ne place pas quelque chose dans IL qui dit "comprendre le type à l'exécution", il connaît le type et le construit, donc il aurait pu le faire pour les membres comme bien.

Ce n'est tout simplement pas le cas. Je suis à peu près sûr que si vous demandiez un vrai compilateur à l'équipe du compilateur C#, vous obtiendriez quelque chose d'officiel, mais il n'y a pas de magie ici et il devrait être possible de faire la même chose pour les champs membres.

+1

Eh oui, il pourrait certainement avoir été fait. Je suppose qu'il n'est pas implémenté par souci de lisibilité - limiter l'inférence de type var à des variables locales signifie que vous ne le voyez que dans le contexte de son utilisation. –

+0

Ceci est incorrect. Vois ma réponse. Il y a des problèmes techniques impliqués. – Brian

1

Le mot clé var a été inventé pour prendre en charge les types anonymes. Vous n'êtes généralement pas en train de déclarer des types anonymes au niveau de la classe, et donc il n'a pas été implémenté.

Votre exemple déclaration

var myList=new List<string> 

est pas un très bon exemple de la façon d'utiliser le mot-clé var car ce n'est pas aux fins prévues.

+1

Je ne suis pas d'accord. Il peut rendre le code plus clair en réduisant la redondance. Voir http://csharpindepth.com/ViewNote.aspx?NoteID=61 –

+0

Même si je suis d'accord que cela réduirait la redondance, ce n'est pas la raison pour laquelle il a été inventé.Les concepteurs de langage n'avaient pas l'intention que le mot-clé soit utilisé ainsi et ne seraient donc pas utilisés au niveau de la classe. –

+0

Je viens de suivre cette habbit ... puisque si ce n'est pas le cas, mon reparateur pluggin m'a une suggestion. –

0

Ce n'est pas aussi simple que la mise en œuvre var dans une méthode puisque vous devez également prendre en modificateurs de Acccount différents et attributs comme ceci:

[MyAttribute()] protected internal readonly var list = new List<T>(); 

Ce que j'aurais vraiment aimé est un type inférés const!

public const notFoundStatus = 404; // int 
+0

Les attributs et les modificateurs n'auraient aucun impact sur ceci puisque var est juste un espace réservé pour le type de l'expression sur le côté droit de l'opérateur d'affectation. Le compilateur remplace simplement magiquement le bon type, et il pourrait le faire avec des modificateurs tout aussi facile. –

0

passe Liste Tapez générique

class Class1 
{ 
    public void genmethod<T>(T i,int Count) 
    { 


     List<string> list = i as List<string>; 

     for (int j = 0; j < Count; j++) 
     { 
      Console.WriteLine(list[j]); 
     } 
    } 
    static void Main(string[] args) 
    { 
     Class1 c = new Class1(); 
     c.genmethod<string>("str",0); 
     List<string> l = new List<string>(); 
     l.Add("a"); 
     l.Add("b"); 
     l.Add("c"); 
     l.Add("d"); 
     c.genmethod<List<string>>(l,l.Count); 

     Console.WriteLine("abc"); 
     Console.ReadLine(); 
    } 
} 
Questions connexes