2016-08-12 2 views
0

私はタスクで働いたが、私はこの構文に遭遇:アクション:指定タスクC#

class Program 
{ 
    static void TestMethod() 
    { 
     Console.WriteLine("Test"); 
    } 

    static void Main(string[] args) 
    { 
     Task t = Task.Run(action: TestMethod); // Why this action: specifier 
     t.Wait(); 
     Console.ReadKey(); 
    } 
} 

私はアクションのキーワードを削除した場合、コンパイラは私に言うエラーメッセージを与えます

エラーCS0121:次のメソッドまたは プロパティ間で呼び出しが曖昧です: 'System.Threading.Tasks.Task.Run(System.Action)'および 'System.Threading.Tasks.Task.Run(System.Func) '

実際には、我々が合格メソッドの戻りTypeを持っていないので、この種のメッセージを取得するには奇妙なので、それがAction代わりのFunc<>として扱われるべきです。

私は、Actionまたは匿名メソッドにキャストするようなエラーを修正する他の多くの方法があることは知っています。しかし、私はこのaction:がどこから来たのか理解できません。

答えて

4

これは、という名前のと呼ばれます。関数呼び出しの引数を名前を指定して任意の順序で指定できるc#言語の機能です。詳細は[https://msdn.microsoft.com/en-us/library/dd264739.aspx]を参照してください。あなたのケースではRunの呼び出しが一意で、System.Threading.Tasks.Task.Run(System.Action)バリアントのみがアクションというパラメータを持つためです。

+1

私はそれが名前付き引数であることに同意しますが、私たちの場合、アクションのパラメータを1つだけ渡すだけです。そして、名前を指定せずに渡すことができます。なぜなら、使用しないときにコードがエラーメッセージをdipslayしたのはなぜですか? –

+0

エラーメッセージには、1つの引数を受け取る2つのバージョンのRunメソッドがあります。渡された引数はSystem.Func型でもSystem.Action型でもないが、両方の型に変換できるため、コンパイラがどのバージョンを取るべきか明確ではない。しかし、渡された引数の名前が指定されていれば、System-ActionバージョンのRunの引数だけが* action *と呼ばれるので、明らかになります。 – MarkusParker

+0

ありがとうございました:) –

0

action:は、パラメータの名前です。ここでは、基本的にはコンパイラに伝えています。ここには何かがあります。これを「アクション」というパラメータに入れてください。この場合、2つのメソッドは同じパラメーター名を持たないため、コンパイラーは呼び出したいものを理解することができます。

サイドノート:これは、関数を呼び出すときにパラメータを順不同で指定したり、以前に他のパラメータを無視していくつかのオプションパラメータのみを指定するためにも使用できます。ときどきかなりクールな機能。

関連する問題