2009-11-10 8 views
22

C#には、組み込みのデリゲートAction<>Func<>があります。この代理人に 'ref'型パラメータを使用することは可能ですか?たとえば、次のコード:C#組み込みのAction <>デリゲートでref型を使用することはできますか?

public delegate void DTest(ref Guid a); 
public event DTest ETest; 

コンパイルします。しかし、Action<>を使用すると、コンパイルされません。

public event Action< ref Guid > ETest; 

ヒント?

答えて

35

いいえ、Actionデリゲートで参照渡しを使用することはできません。フレームワークにはTypeという「型渡しの型」というコンセプトがありますが、C#に関する限り、通常の意味での型ではありません。 refは、パラメータの修飾子であり、タイプ名の一部ではありません。

ただし、独自のタイプの同等のタイプを作成することができます。

もちろん
delegate void ActionRef<T>(ref T item); 

あなたが同じデリゲートでrefと非REFパラメータの混合物をしたい場合、あなたは組み合わせの恐ろしいセットに入る:

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

これはlamda構文で定義する唯一のものですか? ActionRef Setter2 =(ref int x、int y)=> x = y;それは大丈夫です...しかし、ちょっとだけ普通よりも。 – sgtz

+1

@sgtz:それはかなり珍しい要求だと思うので、簡潔にする作業があまりないと驚いていません。 –

+0

「ref R [i]」についてRはリストです。これは可能ですか?これを新しい質問として私に提出してもらえますか? – sgtz

5

あなたはあなたの基準に限り、することができます複合オブジェクト(プロパティを持つ)です。

例オブジェクト:アクションで使用

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; } 
} 

:MyComplexObject参照が変更されないので

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

、データが保存されます。

posted on my blogです。

関連する問題