2008-10-01 3 views
5

Ich weiß, wir können dies nicht auf Klassenebene tun, aber auf Methodenebene können wir das immer tun.Warum können wir nicht var a = neue Liste <string> auf Klassenebene deklarieren?

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

Diese Frage kam mir in den Sinn, da wo wir Variable wie diese erklären. Wir stellen immer die Typinformation an der RHS des Ausdrucks zur Verfügung. Der Compiler muss also nicht tippen. (korrigiere mich, wenn ich falsch liege).

so bleibt die Frage, warum in den Klassen NICHT während sein auf Verfahren Ebene erlaubt

Antwort

6

Es gibt technische Probleme bei der Implementierung dieser Funktion. Die üblichen Fälle scheinen einfach zu sein, aber die schwierigeren Fälle (z. B. Felder, die auf andere Felder in Ketten oder Zyklen verweisen, Ausdrücke, die anonyme Typen enthalten) sind dies nicht.

See Eric Lippert Blog für eine eingehende Erläuterung: Why no var on fields?

5

Die Compiler Jungs die Unterstützung einfach nicht umzusetzen.

Es ist vollständig Compiler Magie, und der Compiler bringt nicht wirklich etwas in IL, sagt "den Typ zur Laufzeit herausfinden", es kennt den Typ und baut es in, so könnte es für Mitglieder als getan haben Gut.

Es tut es einfach nicht.

Ich bin mir ziemlich sicher, dass wenn Sie einen tatsächlichen Compiler-Typ im C# -Compiler-Team fragen würden, würden Sie etwas Offizielles bekommen, aber hier passiert keine Magie und es sollte möglich sein, dasselbe für Mitgliederfelder zu tun.

+1

Yup, es auf jeden Fall hätte getan werden können. Ich vermute, dass es aus Gründen der Lesbarkeit nicht implementiert ist - die Einschränkung der Typinferenz mit var auf lokale Variablen bedeutet, dass man sie nur im Kontext ihrer Verwendung sieht. –

+0

Dies ist falsch. Siehe meine Antwort. Es gibt technische Probleme. – Brian

1

Das Schlüsselwort var wurde speziell für anonyme Typen entwickelt. Normalerweise deklarieren Sie keine anonymen Typen auf Klassenebene und wurden daher nicht implementiert.

Ihr Beispiel Aussage

var myList=new List<string> 

ist nicht ein sehr gutes Beispiel dafür, wie das var Schlüsselwort zu verwenden, da es nicht für den beabsichtigten Zweck ist.

+1

Ich stimme nicht zu. Es kann Code klarer zum Lesen machen, indem Redundanz reduziert wird. Siehe http://csharpindepth.com/ViewNote.aspx?NoteID=61 –

+0

Während ich zustimme, würde es Redundanz reduzieren, das ist nicht der Grund, warum es erfunden wurde.Die Sprachdesigner hatten nicht die Absicht, das Schlüsselwort auf diese Weise zu verwenden und würden daher nicht auf Klassenebene verwendet werden. –

+0

Ich folge nur diesem Habit ... denn wenn ich das nicht tue, winke mir mein reharper pluggin einen Vorschlag. –

0

Es ist nicht so einfach, wie var in einem Verfahren implementiert, da Sie auch in acccount verschiedene Modifikatoren nehmen müssen und Attribute wie so:

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

Was habe mir ein Typ-inferiert wirklich gefallen habe, ist const!

public const notFoundStatus = 404; // int 
+0

Die Attribute und Modifikatoren würden dies nicht beeinflussen, da die Variable nur ein Platzhalter für den Typ des Ausdrucks auf der rechten Seite des Zuweisungsoperators ist. Der Compiler ersetzt einfach magisch den richtigen Typ, und das könnte mit Modifikatoren ebenso einfach sein. –

0

Pass Liste Typ in Allgemein

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(); 
    } 
} 
Verwandte Themen