私はVS2017 RCを使用していますが、私のアプリケーションはネットフレームワーク4.6.1をターゲットにしています。
System.ValueTuple 4.3を参照する2つのアセンブリがあります
MyProject.Services MyProject.WebApi
MyProject.Servicesには、次のようなメソッドを持つクラスがあります。
public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
// Some code...
return (fCount, cCount, aCount);
}
MyProject.WebApiには、このようなメソッドを使用するコントローラーがあります。
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var vm = new ViewModel
{
FCount = stats.fCount,
CCount = stats.cCount,
ACount = stats.aCount
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
Intellisenseは機能していてタプルを分解していますが、コンパイルするとエラーリストウィンドウにエラーが表示されずに失敗します。出力ウィンドウに次のエラーがあります。
2> MyController.cs(83,31,83,40):エラーCS1061: 'ValueTuple'に 'fCount'の定義が含まれておらず、タイプ 'ValueTuple'の最初の引数を受け入れる拡張メソッド 'fCount'が見つかりません( usingディレクティブまたはアセンブリ参照がありませんか?)2> MyController.cs(84,39,84,49):エラーCS1061: 'ValueTuple'には 'cCount'の定義が含まれておらず、拡張メソッド 'cCount'は受け入れませんタイプ「ValueTuple」の最初の引数が見つかりました(usingディレクティブまたはアセンブリ参照がありませんか?)2> MyController.cs(85,35,85,40):エラーCS1061:「ValueTuple」に定義が含まれていません'aCount'の場合、タイプ 'ValueTuple'の最初の引数を受け入れる拡張メソッド 'aCount'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)
[〜#〜] demo [〜#〜]およびDEMO_EXPERIMENTALビルドフラグを追加しようとしましたが、それでも失敗します。
何が悪いのかについての考えは?
編集1:
このコードは機能し、統計は十分に分解されています。私はおそらくバグにぶつかっています。
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var tu = stats.ToTuple();
var vm = new ViewModel
{
FCount = tu.Item1,
CCount = tu.Item2,
ACount = tu.Item3
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
編集2:
こちらのgithubで開いている問題: https://github.com/dotnet/roslyn/issues/162
誰かが同じ罠に陥った場合、これを修正するには、このパッケージを更新する必要があります:Microsoft.Net.Compilersを2.0に(プレリリースを表示する必要があります)
FCount、cCount、aCountを定義していないからだと思います。これを試して
public async Task<(int fCount, int cCount, int aCount)> GetAllStatsAsync()
{
// Some code...
//fCount, cCount, aCount are not defined here, so you should define them
var fCount = 0;
var cCount= 0;
var aCount = 0;
return (fCount , cCount, aCount );
//Other ways:
//return (fCount : 0, cCount: 0, aCount : 0);
//return new (int fCount , int cCount, int aCount ) { fCount = 0, cCount = 0, aCount = 0 };
}
public async Task<HttpResponseMessage> GetInfoAsync()
{
// Some code...
var stats = await _myClass.GetAllStatsAsync();
var vm = new ViewModel
{
FCount = stats.fCount,
CCount = stats.cCount,
ACount = stats.aCount
};
return Request.CreateResponse(HttpStatusCode.OK, vm);
}
この投稿 を見てください