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

Zei*_*kki 87 .net c# visual-studio c#-7.0 visual-studio-2017

我已经安装了一周前发布的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);
}
Run Code Online (Sandbox Code Playgroud)

编译器生成错误:

错误CS8137无法定义使用元组的类或成员,因为无法找到编译器所需类型"System.Runtime.CompilerServices.TupleElementNamesAttribute".你错过了参考吗?

我试着用这个名字在框架中找到一个引用,但没有运气!

如果我们需要额外的东西来使用C#7.0功能,那么我们需要为每个项目做到这一点非常奇怪吗?

Zei*_*kki 127

我刚刚浏览了Roslyn上的这个页面,其中介绍了以下步骤:

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

在此输入图像描述

按照这些步骤,它现在正在工作.但是,对于我们开始的每一个项目,我们都需要这样做真的很奇怪!希望在我们达到官方发布时这是固定的!

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

aaa*_*bbb 46

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

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

我必须做的就是纠正编译错误是从我的项目引用中删除对System.ValueTuple的引用.


mar*_*oss 11

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

Update-Package -Reinstall
Run Code Online (Sandbox Code Playgroud)


Oli*_*ppi 5

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