110

我已经安装了一周前发布的 Visual Studio 2017 Community,并开始探索 C# 7 的新功能。

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

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

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

编译器正在生成错误:

错误 CS8137 无法定义使用元组的类或成员,因为找不到编译器所需的类型“System.Runtime.CompilerServices.TupleElementNamesAttribute”。您是否缺少参考?

我尝试在框架中找到具有此名称的引用,但没有运气!

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

4

4 回答 4

133

我刚刚在Roslyn上浏览了这个页面,其中描述了以下步骤来使其正常工作:

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

在此处输入图像描述

按照这些步骤,它现在正在工作。但是,对于我们开始的每个项目都需要这样做,这真的很奇怪!希望当我们到达正式版本时这个问题得到解决!

于 2016-11-27T07:39:28.373 回答
69

安装 .Net 4.7 Framework 后,我开始收到此错误,并将我的项目更改为目标 .Net 4.7

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

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

于 2017-06-26T23:53:21.910 回答
5

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

Update-Package -Reinstall
于 2019-10-25T10:44:10.343 回答
2

当我从 .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 的引用程序集中找不到类型。

于 2019-09-03T18:38:40.147 回答