をオーバーロード? メソッドのシグネチャ(パラメータなし、戻り値の型はint
)は等しいですか?Task.Factory.StartNewは()私は本当に簡単なコードを持っている
私は解決策を知っています(これはかなり簡単です:var task = Task.Factory.StartNew<int>(GetInt);
)が、私は上記のコードで何が問題なのか知りたいと思います。
をオーバーロード? メソッドのシグネチャ(パラメータなし、戻り値の型はint
)は等しいですか?Task.Factory.StartNewは()私は本当に簡単なコードを持っている
私は解決策を知っています(これはかなり簡単です:var task = Task.Factory.StartNew<int>(GetInt);
)が、私は上記のコードで何が問題なのか知りたいと思います。
メソッドのシグネチャが同じであるため、あいまいな呼び出しエラーが発生します。 戻り値は署名の一部ではありません。
明示的な戻り値の型を指定しないため、コンパイラはどちらを取るべきかわかりません。
StartNewメソッドは、アクション(戻り値がvoid)またはFunc(何かを返す)述部にさまざまなオーバーロードがあり、直接的なデリゲートではないため、コンパイルエラーが発生します。
ジェネリック型のパラメータに'
@ LasseV.Karlsen、なぜそう思うのかわかりません。コードをコンパイルするときに2つのコンパイル時エラーが発生します - 最初のコードはGetIntの戻り値の型が正しくないと言うので、 'code' var task2 = Task.Factory.StartNew(()=> GetInt()); 'code'の短縮バージョンである' code'var task = Task.Factory.StartNew(new Func
は、例外を表示するために役立つだろう:「呼び出しは次のメソッドやプロパティの間であいまいです: 『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>
あなたは最初の署名をとるように強制します。それがなければ、あなたのコードはあいまいです。
他で述べたように、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;
}
、ここで(つまりコンパイル)、それを行うための2つの方法があります。
var task3 = Task.Factory.StartNew((Func<int>)GetInt);
var task4 = Task.Factory.StartNew(() => GetInt());
は、コンパイラが使用するには、これらの2つのオーバーロードのかを決定することはできませんので:
StartNew(Action)
StartNew<TResult>(Func<TResult>)
その理由は、戻り値の型がC#のオーバーロード解決の一部ではないということです(戻り値の型が異なる2つのオーバーロードを持つことはできません)ので、コンパイラはGetInt
はAction
またはFunc<T>
である必要があります。 StartNew<int>(GetInt)
を呼び出してジェネリック版を使用すると、必要な情報が提供されます。
これは最良の解決策であることを示しています。 –
コンパイラエラーとは何ですか? –
自分自身で試してみてください。ドイツ語のコンパイラエラーテキストがあります。 Tasks.TaskFactory.StartNew(システム。アクション) "'しかし 'GetInt'が' void'ではなく 'int'を返します – GameScripting