W języku C# mamy typ danych var
, ale nie możemy go używać jako typu zwracanego przez funkcję.
Dlaczego nie jest to możliwe?Dlaczego nie można zadeklarować funkcji z typem powrotu VAR?
public var myFunction()
{
var = some operations
}
W języku C# mamy typ danych var
, ale nie możemy go używać jako typu zwracanego przez funkcję.
Dlaczego nie jest to możliwe?Dlaczego nie można zadeklarować funkcji z typem powrotu VAR?
public var myFunction()
{
var = some operations
}
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.
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 #. –
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
}
-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. –
myślę to może zepsuć metody przeciążenia zasad.
Cóż, jeśli nie wiesz, jak powinien wiedzieć kompilator? – leppie