VS 2017中的元组语法

25
在VS2017 RC中,当你尝试使用新的元组语法时,会收到以下错误信息:

CS8179 预定义类型 'System.ValueTuple`X' 未定义或未导入

为了使用元组语法,你需要手动在项目中导入ValueTuple nuget包。虽然这只是一个预发布版本,我认为在RTM中它会被更改并默认启用,所以这并不是什么大问题。不幸的是,在最终发布版本中仍然如此,你必须为每个单独的项目下载nuget包才能使用元组语法。
有没有一种方法可以默认启用元组语法以供每个项目使用?

5
作为语言的一个组成部分,元组语法现在应该始终可用,因此这种做法是合理的。仅为使用一种基本的语言特性而下载NuGet包会让人感到奇怪和不舒服。 - user3126358
6
出于同样的原因,你在每个项目中都启用了变量和循环,并且不需要安装任何其他内容。元组语法现在已成为该语言的一部分,就像循环或类一样。 - user3126358
9
如果使用 for 循环需要一个 NuGet 包,使用乘法需要另一个 NuGet 包,那么 .Net 将不会达到现在的高度。如果新的 Tuple 语法实际上是语言的一部分,那么它应该成为语言的一等公民,而不需要外部包。 - Bradley Uffner
4
我认为问题的部分原因是,过去一年中流传的所有“C# 7.0有什么新特性”文章都将新元组语法视为C# 7语言的一部分,而不仅仅是C# 7可以使用的库。我原本期望新的元组功能只是编译器层面上的“语法糖”。我现在明白了我错了,并不是真的很不爽,但是这个功能还是让很多人感到困惑。 - Bradley Uffner
5
@DavidL,你似乎对此非常不满。有人因为新的语言特性发布不到24小时就产生了困惑而提出了一个问题。没有人攻击你,也没有人攻击微软。只是有人试图澄清一些看起来令人困惑的事情。我相信SO非常适合这样的问题:“是否有一种方法可以默认启用元组语法?”答案可能是“否”,但这并不意味着这是一个不好的问题。我保证,一个月后你会回头看到很多人引用这个问题。 - dmeglio
显示剩余24条评论
1个回答

25
根据https://github.com/dotnet/roslyn/issues/13177ITupleValueTuple类型将在.NET Framework 4.7版本之后添加到mscorlib。根据.NET Framework 4.7版本说明,已经添加了这些类型。将其添加到4.6.x中将违反语义版本控制规范。因此,他们提供了一个Nuget包,以便基于较旧框架版本的项目可以使用它。
这类似于.NET 2.0项目想要使用LINQ,其中扩展方法位于System.Core而不是mscorlib。
您可以创建自己的项目模板,暂时引用NuGet包作为一种选择。

https://github.com/dotnet/roslyn/issues/14970 和 https://github.com/dotnet/roslyn/pull/15177 似乎表明当您遇到此错误时,应建议您安装NuGet包。然而,我并没有得到类似的提示。不确定其他人是否有这个问题? - dmeglio
@dman2306 也许出了问题,他们不得不将其撤回。 - Daniel A. White
2
@GrantWinney 我猜在那个时候刷新NuGet引用会很明智。从那里开始,我会怀疑包会非常空。可能只有一些类型转发信息。 - Daniel A. White
1
@GrantWinney 有人还记得在官方发布之前,当他们首次引入asyncawait作为NuGet包Microsoft.Bcl.Async时,如果您仍然将其添加到BCL中,它会做什么吗? 我猜我们会得到与那个包相同的行为。 当然只是猜测... - dmeglio
4
如果您在.NET 4.5环境下运行,Microsoft.Bcl.Async会将所有调用转发到框架版本。 - Scott Chamberlain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接