事前定義されたタイプ 'System.ValueTuple´2´は定義またはインポートされていません


385

Visual Studio 15 Preview 3をインストールし、新しいタプル機能を使用しようとしました

static void Main(string[] args)
{
    var x = DoSomething();
    Console.WriteLine(x.x);
}

static (int x, int y) DoSomething()
{
    return (1, 2);
}

コンパイルするとエラーが発生します。

事前定義されたタイプ 'System.ValueTuple´2´は定義またはインポートされていません

ブログの投稿によると、この機能はデフォルトで「オン」になっているはずです。

何を間違えたのですか?


3
4.6.2をターゲットとする2017 RTMでもNuGetパッケージが必要かどうか誰かが知っていますか?あなたはまだそれを必要としているようですが、私はあなたが最終バージョンにはないことを期待していました。
dmeglio 2017年

代わりにSystem.Tuple <int、int>を使用してみてください
Kevin Xiao

私にとって、このstackoverflow.com/a/46533630/4383425が解決策でした。
アンドレ

回答:


528

.NET 4.6.2以下、.NET Core 1.x、および.NET Standard 1.xの場合、NuGetパッケージをインストールする必要がありますSystem.ValueTuple

Install-Package "System.ValueTuple"

またはVS 2017でパッケージ参照を使用する:

<PackageReference Include="System.ValueTuple" Version="4.4.0" />

.NET Framework 4.7、.NET Core 2.0、および.NET Standard 2.0にはこれらのタイプが含まれます。


3
ありがとう。4.6.2で動作するという意味ですか?デバッガーは引き続きx.Item1 x.Item2を表示します。(xxとxy)の代わりにそれが変わるかどうか知っていますか?
gsharp

2
インストールパッケージ "System.ValueTuple" -IncludePrerelease
Frison Alexander

14
まあ、それは4.6.2にはないようです。
binki

12
4.6.2で動作しますが、まだこのパッケージが必要です。
Elisabeth

8
.NET 4.7では、パッケージはネイティブに含まれています。
マフィイ

40

これはの一部です.NET Framework 4.7

上記のフレームワーク以上(または.NET Core 2.0/ .NET Standard 2.0)をターゲットにしない限り、を参照する必要がありますValueTuple。これを行うには、System.ValueTuple NuGet Package


1
.net 4.7で試したところ、うまくいきませんでしたか?System.ValueTuple`2見つかりません
Bidou

.net Framework 4.7とVisual Studioのターゲットパックをインストールしました。ドロップダウンでバージョン4.7も選択しましたが、コンパイルできません。
Bidou

10
OK問題を見つけました。dllSystem.ValueTupleがプロジェクトファイル(csproj)にハードコードされていました。このエントリをプロジェクトファイルから削除すると、問題が解決しました。
Bidou 2017年

良い解決策ですが、詳細を追加することもできます。私の場合、System.ValueTuple.dllはまだbinフォルダーに残っていました。それを削除したら、よかったです。私の言語バージョンはにdefaultあり、すべて動作しています。
toddmo


5

以下のためのVisual Studioのコードで構築された使用ターミナルと実行します。

dotnet add package "System.ValueTuple"

dotnet restore後で実行することを忘れないでください。


これをVS Codeで機能させることができませんでした。
JonathanPeel

10
注:.Net 4.7ではこれを行わないでください
toddmo


3

他の人が同じ問題を抱えている場合、プロジェクトを4.7に更新した後でこのエラーに遭遇しました。奇妙なことに、このエラーを解消するには、System.ValueTuple参照を削除する必要がありました。


3

ValueTuple.net Frameworkプロジェクトへのパッケージ参照をパッケージとして追加することはお勧めしません。ご存じのとおり、このアセンブリは4.7 .NET Frameworkから利用できます。

プロジェクトがValueTuple、パッケージフォルダーではなく.NET Frameworkフォルダーからすべてのコストで含めようとする特定の状況があり、アセンブリが見つからないというエラーが発生する可能性があります。

今日会社でこの問題がありました。2つのプロジェクトで解決策がありました(私はそれを過度に単純化しています):

  • Lib
  • Web

LibValueTupleを含め、Webを使用していましたLib。これは、いくつかの未知の理由であることが判明したWebに解決パスしようとしたときにValueTuple持っていたHintPath.NET Frameworkディレクトリに、誤ったバージョンを取っていました。そのため、アプリケーションがクラッシュしていました。またはそのアセンブリでValueTupleは定義されていません。問題は非常に奇妙でした。通常は、パッケージフォルダーからアセンブリをコピーします。今回は異常でした。.csprojWebHintPath

私にとって、System.*パッケージ参照を追加することは常にリスクです。彼らはしばしば時限爆弾のようです。彼らは最初は元気で、最悪の瞬間にあなたの顔で爆発することができます。私の経験則:本当に必要がない場合はSystem.*.NET Frameworkに Nugetパッケージを使用しないでください。

私たちは、手動で追加することによって、私たちの問題を解決するValueTuple.csproj、ファイル内部のWebプロジェクト。


1

.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はコンパイルに失敗しました。

https://stackoverflow.com/a/57777123/128709の複製)


0

System.ValueTuple.dllファイルがソース管理下にあることを確認し、.cssprojファイルでその参照を修正する必要がありました。

  1. ソリューションの各プロジェクトを右クリック
  2. プロジェクトをアンロードする
  3. .cssprojファイルを編集:変更

<リファレンスInclude = "System.ValueTuple">

<ヒントパス>

.... \ ProjectName \ ProjectName \ obj \ Release \ Package \ PackageTmp \ bin \ System.ValueTuple.dll

</ヒントパス>

</リファレンス>

<リファレンスInclude = "System.ValueTuple">

<ヒントパス>

.. \ packages \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ヒントパス>

</リファレンス>

  1. 変更を保存してプロジェクトを再読み込み
  2. System.ValueTuple.dllを見つけて、このフォルダーに保存します
  3. このファイルの参照をソース管理に追加する

(オプション):7.別の.dllファイルで同じ問題をこのように解決します


1
固定ファイルパス(または任意の文字列)をハードコーディングすることは、決して良い解決策ではありません。
Arghya C

0

Framework 4.5.2を対象とした以前のプロジェクトの1つで、同じ問題が発生していました。上記のすべてを含むいくつかのシナリオを試しました:ターゲット4.6.1、System.ValueTupleパッケージの追加、bin、obj、および.vsフォルダーの削除。サイコロはありません。4.7.2に対して同じプロセスを繰り返します。その後、1人のコメンターが示唆したように4.7.2を対象としていたため、System.ValueTupleパッケージを削除してみました。まだ何もない。csprojファイルの参照パスを確認しました。右に見えます。4.5.2に戻して、パッケージを再度インストールすることもできます。VSが再起動し、同じフォルダーを数回削除すると、このすべてが発生します。文字通り何もうまくいきませんでした。

代わりに構造体を使用するためにリファクタリングする必要がありました。他の人が今後もこの問題に遭遇しないことを願っていますが、これまでのように困惑している場合は、これが役立つと思いました。

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