2009-11-10 10 views

Odpowiedz

35

Nie, nie można używać przejazdu referencyjnego z delegatami Action. Chociaż istnieje pojęcie "typ przekazany przez odniesienie" jako Type w strukturze, to nie jest to typ w normalnym sensie, jeśli chodzi o C#. ref to modyfikator dla parametru, nie będący częścią nazwy typu, jeśli widzisz co mam na myśli.

Można jednak zbudować własny zestaw równoważnych typów, np.

delegate void ActionRef<T>(ref T item); 

Oczywiście, jeśli chcesz mieszaninę parametrów ref i non-ref w tym samym delegata, dostajesz w okropnym zestaw kombinacji:

delegate void ActionRef1<T1, T2>(ref T1 arg1, T2 arg2); 
delegate void ActionRef2<T1, T2>(T1 arg1, ref T2 arg2); 
delegate void ActionRef3<T1, T2>(ref T1 arg1, ref T2 arg2); 
+0

jest to jedyne do zdefiniowania za pomocą składni lamda? ActionRef Setter2 = (ref int x, int y) => x = y; W porządku ... ale trochę dłużej niż zwykle. – sgtz

+1

@sgtz: Podejrzewam, że tak - to dość niezwykłe wymaganie, więc nie jestem zaskoczony, jeśli nie było zbyt wiele pracy, aby było zwięzłe. –

+0

jak o "ref R [i]" gdzie R jest listą . czy to możliwe? Czy chciałbyś, żebym przedstawił to jako nowe pytanie? – sgtz

5

Można tak długo jak odniesienie jest złożonym obiektem (ma właściwości).

Przykład obiektu:

public class MyComplexObject 
{ 
    /// <summary> 
    /// Name provided for the result. 
    /// </summary> 
    public string Name { get; set; } 

    /// <summary> 
    /// Value of the result. 
    /// </summary> 
    public object Value { get; set; } 
} 

używany w działaniu:

Action<MyComplexObject> myAction = (MyComplexObject result) => 
{ 
    result.Value = MyMethodThatReturnsSomething();            
}; 

Ponieważ odniesienie MyComplexObject nie ulega zmianie, dane są zachowywane.

Również posted on my blog.

Powiązane problemy