未定义或导入预定义类型'System.ValueTuple'2'

时间:2016-07-14 19:44:01

标签: c# visual-studio-2017 c#-7.0

我安装了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'未定义或导入

根据the blog post,此功能默认情况下应为“on”。

我做错了什么?

10 个答案:

答案 0 :(得分:473)

对于.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包括这些类型。

答案 1 :(得分:37)

这是.NET Framework 4.7

的一部分

只要您未定位上述框架或更高版本(或.NET Core 2.0 / .NET Standard 2.0),您就需要引用ValueTuple。通过添加System.ValueTuple NuGet Package

来执行此操作

答案 2 :(得分:13)

ValueTuple类型内置于更新的框架中:

  • .NET Framework 4.7
  • .NET Core 2.0
  • Mono 5.0
  • .Net Standard 2.0

在您定位其中一个较新的框架版本之前,您需要引用ValueTuple包。

http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html

的更多详情

答案 3 :(得分:5)

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

dotnet add package "System.ValueTuple"

不要忘记之后运行dotnet restore

答案 4 :(得分:3)

确保已安装VS .NET 4.6.2 Developer Pack,然后从NuGet中提取System.ValueTuple包。

答案 5 :(得分:3)

如果其他人遇到同样的问题,我在将项目更新到4.7后遇到了这个错误。奇怪的是,我不得不删除System.ValueTuple引用以消除此错误。

答案 6 :(得分:1)

我不建议添加ValueTuple作为.net Framework项目的软件包引用。如您所知,该程序集可从4.7 .NET Framework中获得。

在某些情况下,您的项目将尝试不计一切代价地从.NET Framework文件夹而不是包文件夹包括ValueTuple,这可能会导致某些未找到组装错误。

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

  • Lib
  • Web

Lib包含ValueTuple,而Web使用Lib。事实证明,由于某些未知原因,Web试图将ValueTuple放入.NET Framework目录时,并采用了错误的版本。因此,我们的应用程序崩溃了。 HintPathValueTuple的{​​{1}}中也没有在该程序集的.csproj中定义。这个问题很奇怪。通常,它将从程序包文件夹复制程序集。这次不正常。

对我来说,总是有添加Web软件包引用的风险。它们通常像定时炸弹一样。一开始它们很好,在最坏的时刻它们可以在您的脸上爆炸。我的经验法则:如果对{strong> .NET Framework 没有真正的需要,请不要使用HintPath Nuget程序包。

我们通过在System.*项目内的System.*文件中手动添加ValueTuple来解决问题。

答案 7 :(得分:1)

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

最后,我找到了根本原因:在项目文件夹中存在着{。{1}}的.NET 4.6.2版本(发布操作的输出),MSBuild决定引用此程序集而不是引用位于mscorlib.dll中的官方.NET 4.7.2参考程序集。

由于.NET 4.7中引入了System.ValueTuple,因此MSBuild编译失败,因为它无法在.NET 4.6.2的引用程序集中找到类型。

(与https://stackoverflow.com/a/57777123/128709重复)

答案 8 :(得分: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文件的相同问题

答案 9 :(得分:0)

我们在针对框架4.5.2的一个旧项目中也遇到了同样的问题。我尝试了几种方案,包括上面列出的所有方案:目标4.6.1,添加System.ValueTuple程序包,删除bin,obj和.vs文件夹。没有骰子。对4.7.2重复相同的过程。然后尝试删除System.ValueTuple程序包,因为一位评论者建议我将目标定为4.7.2。依然没有。检查的csproj文件引用路径。看起来不错。甚至下降到4.5.2并再次安装该软件包。所有这几个VS都会重新启动,并多次删除相同的文件夹。从字面上看,什么都没有。

我不得不重构以使用结构。我希望其他人将来不再继续遇到这个问题,但是认为如果您像我们一样陷入困境,这可能会有所帮助。