2012-02-11 16 views
24

似たような質問がありますが、私のようなものはありません。void引数なしのFunc

戻り値のない関数(つまりvoid)とパラメータを持たない関数に相当するFuncはありますか?

関連する質問はFunc not returning anything? ですが、これは無効な型には対応していません。

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

+0

@Anthony Pegram:しかし、私はアクションと、ボイドにタイプに記入する必要がある可能性はない(私は私の質問を編集します、私はミスを犯しました)。 –

答えて

37

あなたの言葉は混乱しています。おそらく、「の戻り値のタイプのない関数であり、パラメータがありません」という意味です。単純にSystem.Actionがあります。あなたのコメントから

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

しかし、私はアクションと、ボイドに<T>タイプに記入する必要が可能性ではありません(私は私の質問を編集します、私はミスを犯しました)。

これは誤解を示しています。アクションデリゲートのTはの入力です。空白はの出力です。アクションデリゲートは、本来、voidを返すデリゲートです。 Tは、の入力の型であり、引き続き引数を指定することができます。

いずれにしても、この回答と他のものが示すように、入力を必要としない代理人Tなしでアクション代理人を持つことができます。

+3

はい、私は完全にがオプションであることを忘れました。助けをありがとうございました。 –

+0

@anthony .NET Framework 3.5より前のバージョンではどうすればよいですか?デリゲートアクションはありません。アクションのみを委任してください。 –

+0

@ ph1983、C#3以前では、C#2.0は*匿名メソッド*のサポートを追加しましたが、代理人を使用しました。わかりやすい質問はありませんが、[MSDN](http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx)でその機能について読むことができます。 –

3

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

13

はい、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:   
  • の.NET Framework 3.5:   
  • の.NET Framework 4。0:
  • シルバー:                                   

アクションは常に持っています戻り値の型はvoidです。 void戻り型はジェネリック型パラメータとして指定する必要はなく、指定できません。

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ジェネリック型にinout修飾子を追加しました:これとは対照的に、Func代表は型を返すと、常に戻り値の型のための少なくとも一つのジェネリック型パラメータを持っているが、「本物」を定義します反共分散および共分散のパラメータ。参照:Covariance and Contravariance in 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) 
関連する問題