Visual Studio 15 Preview 3をインストールし、新しいTuple機能を使用しようとしました
static void Main(string[] args)
{
var x = DoSomething();
Console.WriteLine(x.x);
}
static (int x, int y) DoSomething()
{
return (1, 2);
}
コンパイルするとエラーになります。
定義済みタイプ 'System.ValueTuple´2'は定義されていないかインポートされていません
ブログ投稿 によると、この機能はデフォルトで "on"になっているはずです。
私は何をしましたか?
.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には、これらの種類があります。
.NET Framework 4.7
の一部です。
上記のフレームワーク以上(または.NET Core 2.0
/.NET Standard 2.0
)をターゲットにしていない限り、ValueTuple
を参照する必要があります。これを行うには、System.ValueTuple
NuGet Package
を追加します。
ValueTuple型は、新しいフレームワークに組み込まれています。
これらの新しいフレームワークバージョンのいずれかをターゲットにするまでは、ValueTupleパッケージを参照する必要があります。
詳細は http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html
Visual Studio Code に組み込まれている Terminal を使用して、次のコマンドを実行します。
dotnet add package "System.ValueTuple"
後でdotnet restore
を実行することを忘れないでください。
.NET 4.6.2 Developer Pack VSがインストールされていることを確認してから、NuGetからSystem.ValueTuple
パッケージを取得します。
他の人が同じ問題を抱えている場合、私はプロジェクトを4.7に更新した後にこのエラーに遭遇しました。奇妙なことに、このエラーをなくすにはSystem.ValueTuple参照を削除する必要がありました。
.NET Frameworkプロジェクトへのパッケージ参照としてValueTuple
name__を追加することはお勧めしません。ご存知のように、このアセンブリは4.7 .NET Frameworkから入手できます。
プロジェクトがパッケージフォルダーの代わりに.NET FrameworkフォルダーからValueTuple
name__を含めようとすると、一部のAssembly not foundエラーが発生する場合があります。
今日、会社でこの問題が発生しました。 2つのプロジェクトで解決策がありました(私はそれを単純化しすぎています):
Lib
name__Web
name__Lib
name__にはValueTupleが含まれ、Web
name__にはLib
name__が使用されていました。何らかの未知の理由で、Web
name__へのパスを解決しようとしたときにValueTuple
name__がHintPath
name__を.NET Frameworkディレクトリに持っていて、誤ったバージョンを使用していたことが判明しました。そのため、アプリケーションがクラッシュしていました。 ValueTuple
name__は、そのアセンブリのWeb
name__の.csproj
またはHintPath
name__で定義されていません。問題は非常に奇妙でした。通常、パッケージフォルダーからアセンブリをコピーします。今回は普通ではありませんでした。
私にとっては、System.*
パッケージ参照を追加することは常にリスクです。彼らはしばしば時限爆弾のようなものです。彼らは最初は問題なく、最悪の瞬間にあなたの顔で爆発する可能性があります。私の経験則:本当に必要がない場合は、。NET FrameworkにSystem.*
Nugetパッケージを使用しないでください。
ValueTuple
name__プロジェクト内の.csproj
ファイルにWeb
name__を手動で追加することで問題を解決しました。
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で再起動され、同じフォルダーが数回削除されます。文字通り何も機能しませんでした。
代わりに構造体を使用するためにリファクタリングする必要がありました。他の人が将来この問題に遭遇し続けないことを願っていますが、私たちが困惑したようになってしまうなら、これは役に立つかもしれないと思いました。
System.ValueTuple.dllファイルがソース管理下にあることを確認し、.cssprojファイルでその参照を修正する必要がありました。
<Reference Include = "System.ValueTuple">
<ヒントパス>
....\ProjectName\ProjectName\obj\Release\Package\PackageTmp\bin\System.ValueTuple.dll
</ HintPath>
</参照>
に
<Reference Include = "System.ValueTuple">
<ヒントパス>
..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll
</ HintPath>
</参照>
(オプション):7.他の.dllファイルと同じ問題をこのように解決する