2016-12-16 4 views
0

intやdoubleなどの異なる戻り値の型を持つメソッドがあります。異なるリターンタイプを持つ一般的なデリゲート

しかし、私は今、さまざまな方法を反復しようとしています。

私はこのようにそれを試してみてください。

delegate T MeDelegate<T>(); 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Func<int> d = ReturnFive; 
      d += ReturnTen; 
      d += ReturnTwentyTwo; 
      d += returnDoubles; 

      foreach (int i in GetAllReturnValues(d)) 
       Console.WriteLine(i); 
      Console.ReadKey(); 


     } 

     static IEnumerable<TArgs> GetAllReturnValues<TArgs>(Func<TArgs> d) 
     { 

      List<int> ints = new List<int>(); 
      foreach (Func<TArgs> item in d.GetInvocationList()) 
       yield return item(); 


     } 

     static int ReturnFive() { return 5; } 
     static int ReturnTen() { return 10; } 
     static int ReturnTwentyTwo() { return 22; } 
     static double returnDoubles() { return 1.0; } 

    } 

とofcourseのこの:Func<int> d

doesntの仕事。しかし、これを改善する方法は?

は、私はそれが何をしたいのですかどうか分からないが、以下のコードを使用しようとするあなたに

+1

。 funcの型はコンパイル時に設定され、double型ではありません。ここで何をしようとしているのか分かりませんが、このようなことをしなければならない場合は、戻り値をカプセル化してジェネリックを完全に削除する型を返してください。 – Will

+0

イベントをdに追加するだけです。あなたは関数へのポインタでdを詰めたがっています。 func [] d = new func [] {ReturnFive、ReturnTen、ReturnTwentyTwo、returnDoubles}; – Muckeypuck

答えて

0

ありがとうございます。

delegate T MeDelegate<T>(); 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Func<object> functionDelegates = ReturnFive; 
     functionDelegates += ReturnTen; 
     functionDelegates += ReturnTwentyTwo; 
     functionDelegates += ReturnSomeDoubleValue; 

     foreach (object value in GetAllReturnValues(functionDelegates)) 
     { 
      Console.WriteLine(value); 
     } 
     Console.ReadKey(); 
    } 

    static IEnumerable<TArgs> GetAllReturnValues<TArgs>(Func<TArgs> functionDelegates) 
    { 
     return from Func<TArgs> function in functionDelegates.GetInvocationList() select function(); 
    } 

    static object ReturnFive() { return 5; } 
    static object ReturnTen() { return 10; } 
    static object ReturnTwentyTwo() { return 22; } 
    static object ReturnSomeDoubleValue() { return 1.0; } 

} 
+0

ありがとう!非常にいい – SavantCodeEngineer

+0

@SavantCodeEngineer「動的」を使用しない理由 –

+0

@AmitPore「動的」を使用する理由はありません。 – Servy

0

+ = wires events。あなたがしたいことは、それらを配列に格納することでした。あなたが達成しようとしていますが、別の戻り値の型を持つ関数をしたい場合は、次のことができているか

class Program 
    { 
     static void Main(string[] args) 
     { 
      Func<object>[] d = new Func<object>[] { ReturnFive, ReturnTen, ReturnTwentyTwo, returnDoubles }; 

      foreach (object i in GetAllReturnValues<object>(d)) 
       Console.WriteLine(i); 
      Console.ReadKey(); 


     } 

     static IEnumerable<object> GetAllReturnValues<TArgs>(Func<object>[] d) 
     { 

      List<int> ints = new List<int>(); 
      foreach (Func<object> item in d) 
       yield return item(); 


     } 

     static object ReturnFive() { return 5; } 
     static object ReturnTen() { return 10; } 
     static object ReturnTwentyTwo() { return 22; } 
     static object returnDoubles() { return 1.0; } 

    } 
+1

OPの '+ ='の使用には何も問題はありません。 C#のすべてのデリゲートはマルチキャストデリゲートなので、OPのように組み合わせることができます。 – Servy

+0

私はこれを書いたときに家に帰る途中で私は+ =とinvallallinvocationsを考え始めたと私はおそらくばかだと気づいていませんでした。確認してくれてありがとう。 – Muckeypuck

-1

わからない常にダイナミックあなたがすることはできません

List<dynamic> allReturns = new List<dynamic>{ ReturnFive(), ReturnTen(), ReturnTwentyTwo(), returnDoubles() }; 

foreach (dynamic i in allReturns) 
     Console.WriteLine(i); 
    Console.ReadKey(); 
+0

実際にここでは「動的」の機能を使用していません。 'object'を使用した場合、このコードはまったく同じことを行いますが、すべてが静的にバインドされるため、より速く実行されます。 – Servy

+0

@Servyありがとう、私は理解しています。「ダイナミック」または「オブジェクト」を使用して1行で行うことができる場合、なぜデリゲートを書くのですか。 –

+0

これは例です。この問題を実証するだけです。おそらく実際のコードでは、メソッドをただちに呼び出すことはできません。おそらく、呼び出すコードが提供するパラメータが必要なのかもしれません。多分、複数回呼び出されているなどです。デリゲートを使用する理由はたくさんあります。 – Servy

関連する問題