我已经安装了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 Framework 4.7的一部分。

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

其他回答

我不建议将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文件中来解决这个问题。

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

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

它是. net Framework 4.7的一部分。

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

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