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

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

我做错了什么?


对于。net 4.6.2或更低版本,请使用。net Core 1。. x和。net标准1。安装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都包含这些类型。


确保你为VS安装了。net 4.6.2 Developer Pack,然后拉入System。NuGet中的ValueTuple包。


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

dotnet add package "System.ValueTuple"

之后别忘了运行dotnet恢复。


它是. net Framework 4.7的一部分。

只要你的目标不是上面的框架或更高的框架(或。net Core 2.0 / . net Standard 2.0),你就需要引用ValueTuple。通过添加系统来完成此操作。ValueTuple NuGet包


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文件中的引用:

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

< Reference Include="System. "ValueTuple”>

< 提示路径>

.... ProjectName \ ProjectName obj \发行包PackageTmp \ bin \ ValueTuple。等系统。

</HintPath >

< /引用>

< Reference Include="System. "ValueTuple”>

< 提示路径>

ValueTuple \ packages系统。4 . 4。0李勃\ netstandard1 ValueTuple 0 \系统。等等

</HintPath >

< /引用>

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

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


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

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

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

自由 网络

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

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

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


We were seeing this same issue in one of our old projects that was targeting Framework 4.5.2. I tried several scenarios including all of the ones listed above: target 4.6.1, add System.ValueTuple package, delete bin, obj, and .vs folders. No dice. Repeat the same process for 4.7.2. Then tried removing the System.ValueTuple package since I was targeting 4.7.2 as one commenter suggested. Still nothing. Checked csproj file reference path. Looks right. Even dropped back down to 4.5.2 and installing the package again. All this with several VS restarts and deleting the same folders several times. Literally nothing worked.

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


当我从。net 4.6.2升级到。net 4.7.2时,我也遇到了这个问题。不幸的是,我无法删除对系统的包引用。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副本)