Visual Studio 2017およびC#7.0を使用してメソッドからタプルを返すことができない


98

1週間前にリリースされたVisual Studio 2017 Communityをインストールし、C#7の新機能を探索し始めました。

そこで、2つの値を返す単純なメソッドを作成しました。

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

コンパイラがエラーを生成しています:

エラーCS8137コンパイラに必要なタイプ「System.Runtime.CompilerServices.TupleElementNamesAttribute」が見つからないため、タプルを利用するクラスまたはメンバーを定義できません。参照がありませんか?

私はフレームワークでこの名前のリファレンスを見つけようとしましたが、うまくいきませんでした!

C#7.0の機能を使用するために追加のものが必要な場合、すべてのプロジェクトでそれを行う必要があるのは非常に奇妙です。


回答:


129

これを機能させるための次の手順を説明するRoslynのこのページをたどりました。

  1. C#プロジェクトを開始する
  2. System.ValueTuple NuGet(プレリリース)からパッケージへの参照を追加する

ここに画像の説明を入力してください

これらの手順に従って、現在は機能しています。しかし、私たちが開始するすべてのプロジェクトに対してそれを行う必要があるのは本当に奇妙です!これが公式リリースに達したときに修正されることを願っています!


2
次のリリースで必要なのは、パッケージを簡単に追加できるようにするコード修正です。
2016年

6
この解決策は私を助けました。2017年3月にダウンロードされたVS2017 Professionalのフルリリースバージョンでも!
NIJ

2
これが公用語ではないことに非常に腹を立てています。これが修正であるという同じ問題に遭遇しました。彼らはこれをC#7言語機能として売り込んでいますが、実際にはC#7拡張機能です。新しいRoslynコンパイラー(私はそれが好きです)を使用していると、このようなことが毛むくじゃらになると思います...どちらにしても、これは悲しい副作用IMOです。
Michael Puckett II

10
@MichaelPuckettIIこれは、この機能が.NETフレームワークに存在するクラスを必要とし、まだ新しいものをリリースしていないためだと思います。これが一時的な解決策として、これをNugetパッケージとして含めることでした。次の.NETフレームワークがリリースされたとき、この機能に必要なクラスはすでに組み込まれているはずです。そうでない場合、それはいくつかの説明を必要とする問題です。
Zein Makki 2017年

11
.NET Framework 4.7にアップグレードした後、このエラーを受け取りました。ValueTupleが4.7の一部になっていることがわかりました。タプルパッケージをアンインストールすることが解決策でした
chad.mellor

50

.Net 4.7 Frameworkをインストールした後でこのエラーが発生し始め、プロジェクトを.Net 4.7をターゲットに変更しました

ValueTupleは.Net 4.7に含まれているため、手動でValueTupleを参照する必要はありません。

コンパイルエラーを修正するために必要なのは、プロジェクトの参照からSystem.ValueTupleへの参照を削除することだけでした。


1
すばらしい、あなたの提案に従って、今それは.NET 4.7に含まれています、NuGetからインストールする必要はもうありません。ありがとう。
Gengjun Wu 2018

すでに.netで使用できますか?2019年です
。.net4.7.2

2

.NET 4.6.2から.NET 4.7.2にアップグレードしたため、この問題にも遭遇しました。残念ながら、へのパッケージ参照を削除できませんでしたSystem.ValueTuple使用いる別のNuGetパッケージが依存しているためた。

最終的に私は根本的な原因を見つけることができました:mscorlib.dllプロジェクトフォルダー(公開操作の出力)にある.NET 4.6.2バージョンがあり、MSBuildは公式の.NET 4.7.2リファレンスではなくこのアセンブリを参照することを決定しましたにあるアセンブリC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2

System.ValueTupleが.NET 4.7で導入されたため、.NET 4.6.2の参照アセンブリで型が見つからなかったため、MSBuildはコンパイルに失敗しました。


1

.NET 4.7.2に更新した後もこのエラーが発生し、次を使用してnugetパッケージを再インストールすることで修正できました。

Update-Package -Reinstall
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.