无法从使用 Visual Studio 2017 和 C# 7.0 的方法中 return 元组

Unable to return Tuple from a method using Visual Studio 2017 and C# 7.0

安装了一周前发布的Visual Studio2017 Community,开始探索C#7的新特性

所以我创建了一个简单的方法 returns 两个值:

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

编译器产生错误:

Error CS8137 Cannot define a class or member that utilizes tuples because the compiler required type 'System.Runtime.CompilerServices.TupleElementNamesAttribute' cannot be found. Are you missing a reference?

我尝试在框架中使用此名称查找引用,但没有成功!

如果我们需要额外的东西来使用 C# 7.0 的功能,那么我们需要为每个项目都这样做是很奇怪的?!

我只是 运行 通过 Roslyn 上的此页面,其中描述了以下步骤以使其正常工作:

  1. 启动 C# 项目
  2. 添加对 System.ValueTuple 的引用 来自 NuGet 的包(预发布)

按照这些步骤,它现在可以正常工作了。但是,我们需要为我们开始的每个项目都这样做,这真的很奇怪!希望在我们发布正式版时解决这个问题!

我在安装 .Net 4.7 Framework 并将我的项目更改为目标 .Net 4.7 后开始出现此错误

ValueTuple 现在包含在 .Net 4.7 中,因此您不必手动引用 ValueTuple。

要纠正编译错误,我所要做的就是从我的项目引用中删除对 System.ValueTuple 的引用。

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

我终于找到了根本原因:项目文件夹中有一个 mscorlib.dll 的 .NET 4.6.2 版本(发布操作的输出),MSBuild 决定引用这个程序集而不是位于 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

中的官方 .NET 4.7.2 参考程序集

由于.NET 4.7引入了System.ValueTuple,MSBuild在.NET 4.6.2的引用程序集中找不到类型,导致编译失败

我在更新到 .NET 4.7.2 后也遇到了这个错误,并且能够通过使用以下方法重新安装 nuget 包来修复它:

Update-Package -Reinstall