2010-11-09 13 views

Odpowiedz

12

Uważam, że częściowo wynika to z konstrukcji kompilatora. Eric Lippert blogged o tym, dlaczego pola nie mogą używać niejawnego wpisywania i podejrzewam, że niektóre z tych samych argumentów trzymają się metod.

Ale i tak możesz łatwo skończyć z niejednoznacznością. Na przykład:

var Method1(bool callMethod2) 
{ 
    return callMethod2 ? Method2() : null; 
} 

var Method2() 
{ 
    return Method1(false); 
} 

Jaki powinien być typ?

Prostszy przykład:

var Method1(bool throwException) 
{ 
    if (!throwException) 
    { 
     return Method1(true); 
    } 
    throw new Exception("Bang!"); 
} 

Wprawdzie tego rodzaju niejasności może być po prostu niedozwolone, ale podejrzany że zespół projektowy czuł, że dodany złożoność zarówno w projektowaniu i realizacji nie była warta korzyści . Nie zapominaj, że działają z ograniczonymi zasobami - mając do wyboru między var dla metod i async/await, wybrałbym tę ostatnią w mgnieniu oka. (Co prawda istnieją inne cechy bym wybrali zamiast dynamic, ale to już zupełnie inna sprawa ...)

Należy pamiętać, że powrót typu wnioskowanie jest wykonywane dla wyrażenia lambda, więc sama idea nie jest zwariowany. Np

IEnumerable<string> x = new[] { "x", "y", "z" }; 

var result = x.Select(s => { return s.Length; }); // Long form 

nie kompilator wywodzi kompletny rodzaju ekspresji lambda podczas wykonywania rozdzielczość przeciążenie Select, przekształcając go w Func<string, int>. Nie jest wykluczone stosowanie tych samych pomysłów do metod - tylko skomplikowane.

+4

Twoja analiza jest, jak zwykle, na miejscu. Wykonanie tej funkcji wymaga * całej analizy programu *, która ma znaczący wpływ na architekturę i wydajność kompilatora. Ponadto obowiązują wszystkie powody "no var on fields". Na przykład, że nie mamy znormalizowanego sposobu reprezentowania anonimowego typu w publicznym interfejsie API. Jeśli chcesz języka, który dostarcza tego rodzaju wnioskowania typu, spróbuj F #. –

2

var NIE jest typem danych w języku C#. Dlatego nie można go używać jako parametru powrotu. Kompilator podaje typ w czasie kompilacji z prawej strony przydziału i pamiętając, że w czasie kompilacji wiadomo, że należy użyć prawdziwego typu jako wartości zwracanej. W języku C# 4.0 można użyć typu dynamic:

public dynamic myFunction() 
{ 
    var = some operations 
} 
+0

-1, ponieważ proponowane jest po prostu, że kompilator powinien wywnioskować, jaki jest prawdziwy typ zwracany ... składając deklarację, która używa "var" równoważnego tej samej deklaracji metody z jawnym typem zwracania, wywnioskowanej z instrukcji return wewnątrz ciało metody. To nie jest niepojęte - po prostu skomplikowane. Zauważ, że zostało to już zrobione dla wyrażeń lambda, jak na przykładzie w mojej odpowiedzi. –

-2

myślę to może zepsuć metody przeciążenia zasad.