2009-09-30 9 views
31

Mam metodę z parametrem out i chciałbym wskazać na Action lub Func (lub innego rodzaju delegata) na to.Czy mogę mieć Action <> lub Func <> z out-out?

Działa to dobrze:

static void Func(int a, int b) { } 
Action<int,int> action = Func; 

Jednak nie

static void OutFunc(out int a, out int b) { a = b = 0; } 
Action<out int, out int> action = OutFunc; // loads of compile errors 

robi Prawdopodobnie jest to duplikat, ale poszukiwania 'out parametru' nie jest szczególnie owocne.

+0

możliwe duplikat [FUNC z zewnątrz parametru] (http://stackoverflow.com/questions/1283127/funct-with -out-parameter) – nawfal

Odpowiedz

47

Action i Func specjalnie nie pobierają ani nie podają parametrów. Jednak są to po prostu delegaci.

Można utworzyć niestandardowy typ delegata, który pobiera parametr out i używa go.

Na przykład, następujące prace:

class Program 
{ 
    static void OutFunc(out int a, out int b) { a = b = 0; } 

    public delegate void OutAction<T1,T2>(out T1 a, out T2 b); 

    static void Main(string[] args) 
    { 
     OutAction<int, int> action = OutFunc; 
     int a = 3, b = 5; 
     Console.WriteLine("{0}/{1}",a,b); 
     action(out a, out b); 
     Console.WriteLine("{0}/{1}", a, b); 
     Console.ReadKey(); 
    } 
} 

ten wypisuje:

3/5 
0/0 
+0

W powyższym przykładzie typ 'OutAction ' jest zagnieżdżony wewnątrz typu 'Program'. To jest w porządku. Ale możliwe jest również posiadanie nierozdzielonego typu delegata, tj. "OutAction " może być bezpośrednim członkiem 'namespace'. –

2

Nie, nie z wbudowanych delegatów. out i ref są kwalifikatorami specjalnymi, a pełnomocnik musi być z nimi osobno skonfigurowany, ponieważ są to zupełnie różne style wywoływania.

Jednakże, jeśli zdefiniowano własny delegata, można to zrobić:

delegate void OutAction<T1, T2>(out T1 a, out T2 b); 
Powiązane problemy