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


98

我已经安装了一周前发布的Visual Studio 2017社区,并且我开始探索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功能,那么对于每个项目都需要这样做很奇怪?


Answers:


129

我只是在Roslyn上浏览了该页面,其中描述了以下步骤以使其正常工作:

  1. 启动一个C#项目
  2. 添加对System.ValueTuple NuGet软件包的引用(预发行版)

在此处输入图片说明

遵循这些步骤,它现在可以工作。但是,确实很奇怪,我们需要为每个启动的项目都这样做!希望在到达正式版本时修复此问题!


2
下一发行版中应该包含的一件事是代码修复,可让您轻松添加软件包。
svick

6
这个解决方案对我有帮助;即使拥有2017年3月下载的VS2017 Professional的完整发行版!
Nij

2
很生气,这不是官方语言。解决此问题时遇到了同样的问题。实际上,他们将其作为C#7语言功能进行营销,而实际上它更像是C#7扩展功能。我猜想,当您使用新的Roslyn编译器(我很喜欢)时,事情可能会变得像这样……无论如何,这是IMO的一个令人遗憾的副作用。
Michael Puckett II

10
@MichaelPuckettII我认为这是因为此功能需要.NET框架中存在类,并且他们尚未发布新类,因此这是一个临时解决方案将其作为Nuget包包含在内的原因。当发布下一个.NET框架时,该功能所需的类应该已经内置。如果不是,那么这是一个问题,需要一些解释。
Zein Makki's

11
刚升级到.NET Framework 4.7之后,我收到此错误,结果ValueTuple现在是4.7的一部分,因此卸载元组软件包对我来说是解决方案
chad.mellor

50

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

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

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


1
太好了,按照您的建议,现在它已包含在.NET 4.7中,无需再从NuGet中进行安装。谢谢。
Gengjun Wu

我们可以在.net上使用它吗?现在是2019年。我的目标是.net 4.7.2
user4951

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

由于.NET 4.7中引入了System.ValueTuple的事实,MSBuild编译失败,因为它无法在.NET 4.6.2的引用程序集中找到类型。


1

在更新到.NET 4.7.2之后,我也收到了此错误,并且能够通过使用以下方式重新安装nuget软件包来修复此错误:

Update-Package -Reinstall
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.