web-dev-qa-db-ja.com

引数なしのvoid Func

同様の質問がいくつかありますが、私の質問とはまったく異なります。

戻り値(つまりvoid)とパラメーターのない関数に対応するFuncはありますか?

関連する質問は Funcは何も返さない? ですが、これはvoid型に対しては答えません。

(ビューモデルからビューへのアクションを要求するために必要です)。

30
Michel Keijzers

あなたの言葉遣いは混乱しています。おそらく、「a戻り値の型があり、パラメーターがない関数」を意味します。単純に System.Action があります。

Action action = () => Console.WriteLine("hello world");
action();

あなたのコメントから:

ただし、<T>アクションを入力し、voidを使用することはできません(質問を編集しますが、間違えました)。

これは誤解を示しています。アクションデリゲートのTはinputです。 voidは出力です。Actionデリゲートは、本質的にvoidを返すデリゲートです。 Tは、inputのタイプであり、引数で指定するパラメーターです。

とにかく、この回答や他の回答が示すように、入力なしのデリゲートであるTなしのアクションデリゲートを使用できます。

49
Anthony Pegram

はい、異なる数の入力パラメーターを取り、Action戻り型を持つvoidの異なるオーバーロードがあります。

Action                public delegate void Action()
Action<T>             public delegate void Action<T>(T obj)
Action<T1,T2>         public delegate void Action<T1,T2>(T1 arg1, T2 arg2)
Action<T1,T2,T3>      public delegate void Action<T1,T2,T3>(T1 arg1, T2 arg2, T3 arg3)
...

最初の行は探しているものです。

新しいフレームワークバージョンでは、さらに多くの引数を持つオーバーロードが追加されています。引数の最大数:

  • .NET Framework 2.0:1
  • .NET Framework 3.5:4
  • .NET Framework 4.0:16
  • Silverlight:16

アクションには常にvoid戻り型があります。 void戻り値の型は不要であり、ジェネリック型パラメーターとして指定することはできません。対照的に、Funcデリゲートは「実際の」戻り値の型を定義し、戻り値の型に対して常に少なくとも1つのジェネリック型パラメーターを持ちます。

Func<TResult>           public delegate TResult Func<TResult>()
Func<T,TResult>         public delegate TResult Func<T,TResult>(T arg)
Func<T1,T2,TResult>     public delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2)
...

.NET Framework 4.0は、inおよびout修飾子を、反分散と共分散のジェネリック型パラメーターに追加しました。参照: Genericsの共分散および共分散 。例:

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2)

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)

あなたが探しているのはアクションです。パラメーターは使用せず、値も返しません。

4
RyanR