Asynchronous Tasks と Entity Framework を使用する単純な C# コンソール アプリケーションを作成しています (Mono を使用して Linux (RHEL) で実行することを目的としていますが、それはまったく別の課題です)。.NET 4.0 をターゲットにしているため、.ContinueWith()
代わりに.NET を使用していることに注意してくださいawait
。
これに 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()
ます。Option Infer
ただし、VB.NET 開発者として、この状況ではおそらく依存しています。
C# で使用する呼び出しをコンパイラに明示的に知らせるにはどうすればよいですか?