2009-09-30 21 views
31

私はoutというパラメータを持つメソッドを持っていますが、ActionまたはFunc(または他の種類のデリゲート)を指しています。Outパラメータを指定してAction <>またはFunc <>を使用できますか?

これは正常に動作します:

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

は、しかし、これは

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

これはおそらく重複していないが、 'outパラメータ' を検索すると、特に実りではありません。

+0

[outパラメータとのFunc ]の可能複製(http://stackoverflow.com/questions/1283127/funct-with -out-parameter) – nawfal

答えて

47

ActionとFuncは、具体的にはパラメータを取り出したり参照したりしません。しかし、彼らはただの代議員です。

outパラメータを受け取るカスタムデリゲート型を作成して使用できます。例えば

、次のような作品:

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

これはアウト出力します。いいえ、組み込みの代表者との

3/5 
0/0 
+0

上記の例では、 'OutAction '型が 'Program'型の中にネストされています。これは完璧です。しかし、ネストされていないデリゲート型を持つこともできます。つまり、 'OutAction 'は 'namespace'の直接メンバになります。 –

2

を。 outrefは特殊な修飾子であり、完全に異なる呼び出しスタイルであるため、デリゲートを明示的にセットアップする必要があります。

あなたがあなた自身のデリゲートを定義した場合は、あなたがこれを行うことができます:

delegate void OutAction<T1, T2>(out T1 a, out T2 b); 
関連する問題