Quindi l'ho provato solo per essere sicuro. Si scopre questo funziona bene:
void F(int x) { }
int G<T, U>(int x) { return x; }
class A { }
class B { }
void Main()
{
F(G<A,B>(4));
}
Ma questo produce una serie di errori di compilazione:
void F(bool x, bool y) { }
void Main()
{
int G = 0, A = 1, B = 2;
F(G<A,B>(4));
}
The type or namespace name 'A' could not be found (press F4 to add a using directive or assembly reference)
The type or namespace name 'B' could not be found (are you missing a using directive or an assembly reference?)
The variable 'G' is not a generic method. If you intended an expression list, use parentheses around the < expression.
Quindi la risposta è che l'espressione F(G<A,B>(4))
viene interpretata come una chiamata di funzione generica. Esistono diversi modi per forzare il compilatore a considerarlo come una singola chiamata di due parametri: F(G<A,B>4)
, F((G)<A,B>(4))
o F(G>A,B>(4))
, solo per citarne alcuni.
fonte
2013-08-06 04:33:07
Il secondo !, L'interno G (4) verrà elaborato prima, quindi verrà eseguita la chiamata per F() –
La seconda, ovviamente, –
perché pensi che sia il 2? –