预定义类型'System.ValueTuple´没有定义或导入

我已经安装了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);
}

当我编译时,我得到错误:

预定义类型“系统”。ValueTuple´2´未定义或导入

根据博客文章,该功能在默认情况下应该是“开启”的。

我做错了什么?

134420 次浏览

对于。net 4.6.2或更低版本,请使用。net Core 1。. x和。net标准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 4.6.2开发包 for VS,然后从NuGet中导入System.ValueTuple包。

对于Visual Studio代码,使用内置的终端并运行:

dotnet add package "System.ValueTuple"

不要忘记之后运行dotnet restore

它是.NET Framework 4.7的一部分。

只要你的目标不是上面的框架或更高的框架(或.NET Core 2.0 / .NET Standard 2.0),你就需要引用ValueTuple。通过添加System.ValueTuple NuGet Package

ValueTuple类型被构建到新的框架中:

  • .NET Framework 4.7
  • .NET Core 2.0
  • Mono 5.0
  • .Net标准2.0

在您的目标是那些较新的框架版本之前,您需要引用ValueTuple包。

更多细节在http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html

为了防止其他人遇到同样的问题,我在将一个项目更新到4.7后遇到了这个错误。奇怪的是,我不得不移除这个系统。ValueTuple引用来消除此错误。

我必须检查System.ValueTuple.dll文件是否在源代码控制下,并纠正其在.cssproj文件中的引用:

  1. 右键单击解决方案中的每个项目
  2. 卸载项目
  3. 编辑.cssproj文件:change

& lt;参考包括= "系统。ValueTuple”>

& lt;HintPath >

…\ ProjectName释放\ ProjectName \ obj \ \包装\ PackageTmp \ bin \ System.ValueTuple.dll

& lt;/ HintPath >

& lt;/参考>

& lt;参考包括= "系统。ValueTuple”>

& lt;HintPath >

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

& lt;/ HintPath >

& lt;/参考>

  1. 保存更改并重新加载项目
  2. 找到System.ValueTuple.dll并保存到这个文件夹中
  3. 将此文件的引用添加到源代码控制中

(可选):7。用这种方法解决另一个.dll文件的相同问题

我不建议将ValueTuple作为包引用添加到.net框架项目中。如你所知,这个程序集可以从4.7 . net Framework中获得。

在某些情况下,你的项目会不惜一切代价从。net框架文件夹中包含ValueTuple而不是包文件夹,这可能会导致一些程序集未找到错误。

我们今天在公司遇到了这个问题。我们有两个项目的解决方案(我过于简化了):

  • Lib
  • Web

Lib包含ValueTuple,而Web使用Lib。事实证明,由于一些未知的原因,Web在试图解析路径到ValueTuple时,将HintPath放入。net框架目录,并采用了不正确的版本。我们的应用程序因此崩溃了。ValueTuple没有在Web.csproj中定义,也没有在该程序集的HintPath中定义。这个问题很奇怪。通常它会从包文件夹复制程序集。这次不正常。

对我来说,添加System.*包引用总是有风险的。他们通常就像定时炸弹。他们一开始还好,但在最糟糕的时刻,他们可能会在你面前爆发。我的经验法则:不要为net框架使用System.* Nuget包,如果它们不是真正需要的话。

我们通过手动将ValueTuple添加到Web项目中的.csproj文件中来解决这个问题。

我们在一个针对Framework 4.5.2的旧项目中也看到了同样的问题。我尝试了几个场景,包括上面列出的所有场景:目标4.6.1,添加系统。ValueTuple包,删除bin、obj和.vs文件夹。不行。对4.7.2重复相同的过程。然后尝试删除系统。ValueTuple包,因为我的目标是4.7.2,就像一个评论者建议的那样。还是什么都没有。检查了csproj文件引用路径。看起来是正确的。甚至回落到4.5.2并重新安装包。所有这些都是通过多次重新启动VS并多次删除相同的文件夹完成的。什么都不管用。

我不得不重构以使用结构体代替。我希望其他人将来不要继续遇到这个问题,但如果你最终像我们一样被难住了,这可能会有帮助。

当我从。net 4.6.2升级到。net 4.7.2时,我也遇到了这个问题。不幸的是,我无法删除对System.ValueTuple的包引用,因为我使用的另一个NuGet包依赖于它。

最后我找到了根本原因:在项目文件夹中有一个。net 4.6.2版本的mscorlib.dll(发布操作的输出),MSBuild决定引用这个程序集,而不是位于C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2中的正式的。net 4.7.2引用程序集。

由于系统。ValueTuple是在。net 4.7中引入的,MSBuild编译失败,因为它在。net 4.6.2的参考程序集中找不到该类型。

(https://stackoverflow.com/a/57777123/128709的副本)