web-dev-qa-db-ja.com

C#7 ValueTupleコンパイルエラー

私は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

32
JuChom

誰かが同じ罠に陥った場合、これを修正するには、このパッケージを更新する必要があります:Microsoft.Net.Compilersを2.0に(プレリリースを表示する必要があります)

42
Swell

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);
}

@スウェル提案で編集

この投稿 を見てください

0

他の答えに追加したいだけです。

参照からSystem.valuetupleを削除します。そうでなければ、それは機能せず、理由はわかりません。基本的に、Tupleの値はすでに4.7.2に含まれているため、Visual Studio 2019を使用すれば準備は完了です。

Visual Studio 2019を使用していて、私が使用した場合、それが私にとってうまくいきました。理由は正確にはわかりません。ナゲットの必要はありません。直接参照する必要はありません。

enter image description here

.netフレームワーク4.7.2を使用するプロジェクトをターゲットに設定し、valuetupleへの参照を削除します。

0
user4951