未定义或导入预定义类型“ 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

您可以尝试改用System.Tuple <int,int>
Kevin Xiao

对我来说,这个stackoverflow.com/a/46533630/4383425是解决方案。
安德烈

Answers:


527

对于.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中。
宾基

12
适用于4.6.2,尽管仍然需要此软件包。
伊丽莎白

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
好的,我刚刚发现了问题:dll System.ValueTuple被硬编码在我的项目文件(csproj)中。从项目文件中删除该条目可解决此问题。
Bidou

好的解决方案,但是您可以添加更多详细信息。就我而言,System.ValueTuple.dll仍在我的bin文件夹中闲逛。删除该内容后,我会很高兴。我的语言版本已发布,default并且一切正常。
toddmo '17




3

如果其他人有相同的问题,则在将项目更新为4.7后遇到了该错误。奇怪的是,我不得不删除System.ValueTuple引用才能使此错误消失。


3

我不建议将ValueTuple.net Framework项目作为包参考添加。如您所知,此程序集可从4.7 .NET Framework获得。

在某些情况下,您的项目将尝试不惜一切代价ValueTuple从.NET Framework文件夹而不是package文件夹中包含它,并且这可能会导致某些程序集未找到错误。

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

  • Lib
  • Web

Lib包含ValueTuple并Web正在使用Lib。原来,一些未知的原因,Web试图解决路径时,ValueTuple为具有HintPath到.NET框架的目录,并采取不正确的版本。因此,我们的应用程序崩溃了。ValueTuple未在定义.csprojWeb,也不HintPath为组件。这个问题很奇怪。通常,它将从程序包文件夹复制程序集。这次不正常。

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

我们通过手动添加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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.