2012-12-17 6 views
7

Mi sono chiesto come sia la sintassi esatta per i parametri ref e out per i delegati e le funzioni lambda inline.Func/Action delegati con argomenti/parametri di riferimento o funzioni anonime

ecco un esempio

se la funzione è definita come

public void DoSomething(int withValue) { } 

delegato in una funzione può essere creato

public void f() 
{ 
    Action<int> f2 = DoSomething; 
    f2(3); 
} 

come è che la sintassi, se la funzione originale sarebbe definito come

public void DoSomething(ref int withValue) { withValue = 3; } 

risposta

12

è necessario definire un nuovo tipo di delegato per questo metodo di firma:

delegate void RefAction<in T>(ref T obj); 

public void F() 
{ 
    RefAction<int> f2 = DoSomething; 
    int x = 0; 
    f2(ref x); 
} 

Il motivo per cui il .NET Framework non include questo tipo è probabilmente perché ref parametri non sono molto comuni, e il numero di tipi necessari esplode se aggiungi un tipo di delegato per ogni combinazione possibile.

4

Non è possibile utilizzare Action, Func<T>, o il built-nei delegati, ma hanno bisogno di definire la propria in questo caso:

delegate void ActionByRef<T>(ref T value); 

Poi, dato questo, si può avere:

int value = 3; 
ActionByRef<int> f2 = DoSomething; 
f2(ref value);