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

Posted

技术标签:

【中文标题】无法从使用 Visual Studio 2017 和 C# 7.0 的方法返回元组【英文标题】:Unable to return Tuple from a method using Visual Studio 2017 and C# 7.0 【发布时间】:2017-04-11 03:16:38 【问题描述】:

我已经安装了一周前发布的 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 的特性,那么我们需要为每个项目都这样做是很奇怪的?!

【问题讨论】:

Enabling c# 7 in a asp.net application的可能重复 【参考方案1】:

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

    开始一个 C# 项目 添加对System.ValueTuple的引用 NuGet 包(预发布)

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

【讨论】:

下一版本中应该包含的一件事是代码修复,可让您轻松添加包。 这个解决方案帮助了我;即使是 2017 年 3 月下载的 VS2017 Professional 完整版! 很生气,这不是官方语言。遇到了同样的问题,这是修复。他们将其作为 C# 7 语言功能进行营销,而实际上它更像是 C# 7 扩展功能。我想当你使用新的 Roslyn 编译器(我是它的粉丝)时,事情会变得像这样令人毛骨悚然......无论如何,这都是 IMO 的一个可悲的副作用。 @MichaelPuckettII 我认为这是因为此功能需要类在 .NET 框架中存在并且他们还没有发布新的,这就是为什么临时解决方案是将其包含为一个 Nuget 包。当下一个 .NET 框架发布时,该功能所需的类应该已经内置。如果不是,那么这是一个需要解释的问题。 刚升级到 .NET Framework 4.7 后我收到了这个错误,原来 ValueTuple 现在是 4.7 的一部分,所以卸载 tuple 包是我的解决方案【参考方案2】:

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

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

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

【讨论】:

太好了,按照你的建议,现在它包含在 .NET 4.7 中,不再需要从 NuGet 安装。谢谢。 我们可以在 .net 上使用它吗?现在是 2019 年。我的目标是 .net 4.7.2【参考方案3】:

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

Update-Package -Reinstall

【讨论】:

【参考方案4】:

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

最后我找到了根本原因:项目文件夹中有一个 .NET 4.6.2 版本的mscorlib.dll(发布操作的输出),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 的引用程序集中找不到类型。

【讨论】:

以上是关于无法从使用 Visual Studio 2017 和 C# 7.0 的方法返回元组的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2017无法安装提示无法联网,而且还无法从官网下载Vs2017

无法从UIKit.UIImage转换为ZXing.LuminanceSource - 2017年Visual Studio中的Xamarin iOS

Visual Studio 2017 - 无法安装 WDK 扩展

在 Visual Studio 2017 上无法使用调试模式 x64 进行 opencv3.2 编译

文件无法访问 - Visual Studio 2017

是啥导致 Visual Studio 2017 中的文件名为空