2011-12-09 13 views
5

Jeśli mam metodęShorthand podczas wywoływania metody rodzajowe w C#

void foo<T>(T bar){} 

mogę z powodzeniem nazwać tak:

string s = string.Empty; 
foo(s); 

Jak wyobrazić kompilator/runtime można ustalić typ,

jednak Gdybym zmienić metodę do tego:

T foo<T,T2>(T2 bar){...} 

Wtedy muszę nazwać go „pełny”, określając zarówno typ parametru wejściowego i Zwraca typ:

string s = string.Empty; 
foo<int,string>(s); 

Czy istnieje sposób mogę skrótowym to więc nie należy określić parametr wejściowy (e) rodzaj? I.E.

foo<int>(s); 

Dzięki

+0

Aby wyjaśnić „Wyobrażam sobie, że kompilator/runtime można wywnioskować typ”: wnioskowanie typu w przykładzie jest obsługiwane przez kompilator. – phoog

Odpowiedz

3

Zawsze możesz przepisać swoją metodę:

void foo<T, U>(U bar, out T baz) 
{ 
    baz = default(T); 
} 

jeśli naprawdę chcesz typ wnioskowania ... Teraz:

string s = string.Empty; 
int i; 

foo(s, out i); 

będzie działać dobrze.

Zobacz także: this question dla doskonałej odpowiedzi Eric Lippert, dlaczego nie możesz mieć tego, czego chcesz!

EDIT: Zdaję sobie sprawę, że nie właściwie odpowiedzieć na to pytanie ...

Czy istnieje sposób mogę skrótowym to więc nie musisz określić parametr (y) INPUT TYPE?

Po prostu ... Nie

3

Niestety, nie ma sposobu, aby kompilator wywnioskować T od przykładu z użytkowania. O ile nie można tego zrobić automatycznie, musisz je podać.

Nie ma "opcjonalnych" parametrów typu w języku C# i nie ma skrótów.

+0

Czy ten rodzaj wnioskowania nie działa z wyrażeniami? Jeśli tak, to dlaczego nie za pomocą metod? – Connell

+0

Czy mógłbyś wyjaśnić, co masz na myśli pod "tego rodzaju wnioskowania pracy z wyrażeniami". Może możesz wysłać przykład? –

+0

Po prostu chodzę i zawsze jest błąd kompilacji, niezależnie od sposobu, w jaki próbuję, ale myślałem o delegatach lub o lambdzie. Czy Func nie robi dokładnie tego? – Connell

Powiązane problemy