私は、非同期タスクとEntity Frameworkを使用する単純なC#コンソールアプリケーションを作成しています(Linux(RHEL)でMonoで実行する意図がありますが、それは他の課題です)。私は.NET 4.0をターゲットにしているので、await
の代わりに.ContinueWith()
を使用しています。GenericWithであいまいな呼び出し
これに加えて、NorthwindデータベースのEF DBモデル、アプリケーションの全体です:
using System;
using System.Linq;
using System.Threading.Tasks;
namespace MonoEF
{
class Program
{
private static Model.NorthwindEntities _db = new Model.NorthwindEntities();
static void Main(string[] args)
{
try
{
GetCustomerNamesAsync().ContinueWith(t => {
if (t.IsFaulted) Console.WriteLine(t.Exception.Flatten.ToString);
else if (t.IsCompleted) foreach (string result in t.Result) Console.WriteLine(result);
});
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private static Task<string[]> GetCustomerNamesAsync()
{
return Task.Factory.StartNew(() => (from c in _db.Customers select c.ContactName).Distinct().ToArray());
}
}
}
問題は、私は.ContinueWith()
で次のエラーを取得しています:
Ambiguous Invocation:
System.Threading.Tasks.Task.ContinueWith(System.Action<System.Threading.Tasks.Task<string[]>>) (in class Task<string[]>)
System.Threading.Tasks.Task.ContinueWith(System.Action<System.Threading.Tasks.Task>) (in class Task)
match
私にとって、呼び出しはあいまいであってはなりません。コンパイラーは汎用タスクを非汎用タスクよりも好むべきです、特にそれはGetCustomerNamesAsync()
の出力です。しかし、VB.NET開発者として、私はおそらくOption Infer
に頼っているでしょう。
どのような呼び出しをC#で使用したいのかをコンパイラに明示的に知らせる方法はありますか?
あなたは私を正しい解決に導いてくれました。明示的に '.ContinueWith((タスクt)=> {...})'を宣言すると、次の問題のマスクが解除され、 'Console.WriteLine 'の代わりに' Console.WriteLine(t.Exception.Flatten.ToString) (t.Exception.Flatten()。ToString()) '。これを修正した後、私は明示的なラムダパラメータ宣言を削除することができ、コンパイラは満足していました。 –
MCattle
@ MCattle興味深いことに、そこに括弧がないと、コンパイラは2つの過負荷の間で判断できなくなります。私は自分自身で 'ContinueWith'を何度も使用した無数の回数をラムダ入力型に明示的に与えることを覚えていなかったので、私自身の答えは少し不審でした。括弧が足りないことがなぜ違うのか説明できません。 –
使い方によって過負荷が推測され、使用法に構文エラーがある場合、正しい過負荷を推論することができないため、私には意味があります。 – MCattle