419

我已经安装了 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”

根据博客文章,默认情况下此功能应为“开启”。

我做错了什么?

4

10 回答 10

562

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

于 2016-07-14T19:49:14.843 回答
45

它是.NET Framework 4.7.

只要您不针对上述框架或更高版本(或.NET Core 2.0/ .NET Standard 2.0),您就需要参考ValueTuple. 通过添加System.ValueTuple NuGet Package

于 2017-04-06T20:01:35.567 回答
14

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

  • .NET 框架 4.7
  • .NET 核心 2.0
  • 单声道 5.0
  • .Net 标准 2.0

在您针对这些较新的框架版本之一之前,您需要引用 ValueTuple 包。

更多详细信息,请访问http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html

于 2017-05-28T21:55:13.967 回答
5

对于Visual Studio Code,使用内置终端并运行:

dotnet add package "System.ValueTuple"

之后别忘了跑dotnet restore

于 2017-03-10T08:50:17.217 回答
3

确保您已安装.NET 4.6.2 Developer Pack for VS,然后System.ValueTuple从 NuGet 拉入包。

于 2016-12-07T13:13:17.830 回答
3

如果其他人有同样的问题,我在将项目更新到 4.7 后遇到了这个错误。奇怪的是,我必须删除 System.ValueTuple 引用才能让这个错误消失。

于 2017-12-18T18:19:32.947 回答
3

当我从 .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 中引入的,MSBuild 编译失败,因为它在 .NET 4.6.2 的引用程序集中找不到类型。

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

于 2019-09-03T18:44:19.423 回答
2

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

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

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

  • Lib
  • Web

Lib包括 ValueTuple 并Web使用Lib. 事实证明,Web在尝试解析路径时,由于某种未知原因ValueTupleHintPath进入 .NET Framework 目录并采用了不正确的版本。我们的应用程序因此而崩溃。ValueTuple没有为该程序集定义.csprojWeb也没有HintPath为该程序集定义。这个问题非常奇怪。通常它会从包文件夹中复制程序集。这一次不正常。

System.*对我来说,添加包引用总是有风险的。它们通常就像定时炸弹。它们一开始还不错,但在最糟糕的时刻它们会在你的脸上爆炸。我的经验法则:如果没有真正需要,请不要将System.*Nuget 包用于.NET Framework 。

我们通过手动添加ValueTuple到项目.csproj内的文件中解决了我们的问题Web

于 2019-06-24T20:17:30.550 回答
1

我必须检查 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 文件的相同问题

于 2018-08-24T11:09:58.023 回答
0

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

我不得不重构以使用结构。我希望其他人将来不会继续遇到这个问题,但我认为如果你最终像我们一样难过,这可能会有所帮助。

于 2019-07-30T16:13:23.070 回答