2008-10-01 11 views
5

Wiem, że nie możemy tego zrobić na poziomie klasy, ale na poziomie metody zawsze możemy to zrobić.Dlaczego nie możemy zadeklarować var ​​a = new List <string> na poziomie klasy?

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

To pytanie przyszło mi do głowy odkąd deklarujemy zmienną w ten sposób. Zawsze podajemy informacje o typie na RHS wyrażenia. Kompilator nie musi więc zgadywać typu. (Popraw mnie, jeśli się mylę).

więc pozostaje pytanie DLACZEGO NIE na poziomie klasy, podczas gdy jego dopuszczone metody poziomie

Odpowiedz

6

Wystąpiły problemy techniczne związane z wdrażaniem tej funkcji. Powszechne przypadki wydają się proste, ale trudniejsze przypadki (np. Pola odwołujące się do innych pól w łańcuchach lub cyklach, wyrażenia zawierające typy anonimowe) nie są. blog

Zobacz Eric Lippert za wyjaśnienie dogłębnej: Why no var on fields?

5

Chłopaki kompilator po prostu nie realizuje wsparcie.

To jest w całości kompilatorowa magia, a kompilator nie wstawia do IL czegoś, co mówi "wykryj typ w czasie wykonywania", zna typ i wbudowuje go, więc mógł to zrobić dla członków jako dobrze.

Po prostu nie.

Jestem prawie pewny, że gdybyś zapytał faktycznego kompilatora w zespole kompilatorów C#, dostałeś coś oficjalnego, ale nie ma tu magii i powinno być możliwe to samo dla pól członków.

+1

Tak, może to zdecydowanie zostały wykonane. Podejrzewam, że nie został on zaimplementowany ze względu na czytelność - ograniczenie typu wnioskowania zmiennymi do zmiennych lokalnych oznacza, że ​​widzisz je tylko w kontekście jego użycia. –

+0

To jest nieprawidłowe. Zobacz moją odpowiedź. Występują problemy techniczne. – Brian

1

Słowo kluczowe var zostało wymyślone specjalnie do obsługi typów anonimowych. Generalnie NIE będziesz deklarował typów anonimowych na poziomie klasy, a zatem nie został on zaimplementowany.

Twój przykład stwierdzenie

var myList=new List<string> 

nie jest bardzo dobrym przykładem tego, jak używać słowa kluczowego var ponieważ nie jest zgodne z przeznaczeniem.

+1

Nie zgadzam się. Może sprawić, że kod stanie się bardziej czytelny dzięki redukcji nadmiarowości. Zobacz http://csharpindepth.com/ViewNote.aspx?NoteID=61 –

+0

Zgadzam się, że zmniejszyłoby to nadmiarowość, to nie jest powód, dla którego został wymyślony.Projektanci języków nie zamierzali używać słowa kluczowego w ten sposób, a zatem nie byliby wykorzystywani na poziomie klasy. –

+0

Po prostu podążam za tym habbirem ... ponieważ jeśli tego nie zrobię, moja wtyczka reharper zachęci mnie do sugestii. –

0

To nie jest tak proste, jak wdrożenie var w metodzie ponieważ trzeba również brać pod konta usługi różne modyfikatory i atrybuty tak:

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

Co ja naprawdę się podobało to typ-inferenced const!

public const notFoundStatus = 404; // int 
+0

Atrybuty i modyfikatory nie miałyby na to wpływu, ponieważ var jest po prostu symbolem zastępczym dla typu wyrażenia po prawej stronie operatora przypisania. Kompilator po prostu magicznie zastępuje właściwy typ i może to zrobić z modyfikatorami równie łatwo. –

0

Przełęcz Lista Wpisz Generic

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(); 
    } 
} 
Powiązane problemy