2012-04-05 20 views
8

をオーバーロード? メソッドのシグネチャ(パラメータなし、戻り値の型はint)は等しいですか?Task.Factory.StartNewは()私は本当に簡単なコードを持っている

私は解決策を知っています(これはかなり簡単です:var task = Task.Factory.StartNew<int>(GetInt);)が、私は上記のコードで何が問題なのか知りたいと思います。

+3

コンパイラエラーとは何ですか? –

+0

自分自身で試してみてください。ドイツ語のコンパイラエラーテキストがあります。 Tasks.TaskFactory.StartNew(システム。アクション) "'しかし 'GetInt'が' void'ではなく 'int'を返します – GameScripting

答えて

3

メソッドのシグネチャが同じであるため、あいまいな呼び出しエラーが発生します。 戻り値は署名の一部ではありません。

明示的な戻り値の型を指定しないため、コンパイラはどちらを取るべきかわかりません。

Method Signature in C#

+1

あなたは本当にあなたの答えを言い換える必要があると思います:アクションはFunc とは非常に異なるタイプです。あなたの答えは現在、 'StartNew'実装がコンパイルすべきでないように読み込まれます。 – ChrisWue

+0

注目、ありがとうございます。 – Alex

0

StartNewメソッドは、アクション(戻り値がvoid)またはFunc(何かを返す)述部にさまざまなオーバーロードがあり、直接的なデリゲートではないため、コンパイルエラーが発生します。

+1

ジェネリック型のパラメータに' 'を指定すると"手を振る "ように聞こえるでしょうより多くのアクション 'や'のFunc ''のようにデリゲートを作るので、明らかにその部分自体を推定することが可能である。 –

+0

の提供コールが完全に明確なことができます。何の署名 'タスク StartNew (アクション)'はありません。 –

+0

@ LasseV.Karlsen、なぜそう思うのかわかりません。コードをコンパイルするときに2つのコンパイル時エラーが発生します - 最初のコードはGetIntの戻り値の型が正しくないと言うので、 'code' var task2 = Task.Factory.StartNew(()=> GetInt()); 'code'の短縮バージョンである' code'var task = Task.Factory.StartNew(new Func (GetInt); 'コード'。 –

1

は、例外を表示するために役立つだろう:「呼び出しは次のメソッドやプロパティの間であいまいです: 『System.Threading.Tasks.TaskFactory.StartNew(System.Action)』と「System.Threading .Tasks.TaskFactory.StartNew(System.Func)」」

あなたが見てみる場合は2つの方法があります:あなたは<int>やサプライを追加する場合

public Task<TResult> StartNew<TResult>(Func<TResult> function); 
public Task StartNew(Action action); 

は、 Func<int>あなたは最初の署名をとるように強制します。それがなければ、あなたのコードはあいまいです。

0

他で述べたように、StartNewの関数としてGetIntを渡すか、ジェネリック型を指定してStartNewから値を返すことを指定する必要があります。それ以外の場合、コンパイラはどのようなタスクを作成しようとしているのか分かりません....あいまいです。

レコードの
static void Main(string[] args) 
{ 
    var task = Task.Factory.StartNew<int>(GetInt); 

    var task2 = Task.Factory.StartNew(
     () => 
     { 
      return GetInt(); 
     }); 
} 

static int GetInt() 
{ 
    return 64; 
} 
1

、ここで(つまりコンパイル)、それを行うための2つの方法があります。

var task3 = Task.Factory.StartNew((Func<int>)GetInt); 
var task4 = Task.Factory.StartNew(() => GetInt()); 
3

は、コンパイラが使用するには、これらの2つのオーバーロードのかを決定することはできませんので:

StartNew(Action) 
StartNew<TResult>(Func<TResult>) 

その理由は、戻り値の型がC#のオーバーロード解決の一部ではないということです(戻り値の型が異なる2つのオーバーロードを持つことはできません)ので、コンパイラはGetIntActionまたはFunc<T>である必要があります。 StartNew<int>(GetInt)を呼び出してジェネリック版を使用すると、必要な情報が提供されます。

+0

これは最良の解決策であることを示しています。 –

関連する問題