获取“Tuple element name is inferred. Please use language version 7.1 or greater to access an element by its inferred name.”

51

我们有以下的代码,之前一直在我们的UWP应用中正常运行,但今天在更新到最新版本的Visual Studio 2017 15.3后出现了问题。

private void Test()
{
    var groups = new List<(Guid key, IList<(string, bool)> items)>();

    var items = new List<(string, bool)>
    {
        ("a", true),
        ("b", false),
        ("c", false)
    };
    var group = (Guid.NewGuid(), items);

    groups.Add(group);
}

输出窗口中没有错误消息,但是有以下内容:

Tuple元素名称“items”已被推断。请使用语言版本7.1或更高版本,按其推断的名称访问元素。

有任何想法为什么会这样,以及如何解决?


4
@itsme86 嗯,我不能只是将它升级到使用C#7.1,因为它是一个UWP应用程序。 - Jessica
这与你的问题无关,但是像 new List<(Guid key, IList<(string, bool)> items)> 这样的类型可以很好地反对元组。 除了添加项目之外,没有任何操作是有效或明显的 - 考虑一下是否希望使用 Dictionary<Guid, HashSet<string>> 等类似类型。 (显然,适当的类型完全取决于您的用例,但是嵌套的元组列表通常不是最佳选择。) - Jeroen Mostert
@itsme86 你知道如何指定语言版本7.1吗?我猜这只是一个与预览相关的错误信息,还没有在非预览版的Visual Studio 2017中提供。 - Lasse V. Karlsen
2
@Jessica 转向 C# 7.1 对于 UWP 应用程序来说应该是完全没问题的。C# 7.1 编译器已经在使用中,语言版本标志只控制可用的功能。 - JaredPar
@JaredPar,你能给我演示一下吗? - Jessica
3个回答

81

项目->属性->生成->高级->语言版本->C# 最新次要版本


谢谢!这个方法真的有效,不需要绕过去。我不知道我可以这样做。 - Jessica
7
如果你没有安装Visual Studio,那么在csproj文件中添加 <LangVersion>latest</LangVersion> 即可。请注意,不要改变原意,并使翻译更加通俗易懂。 - python_kaa
1
谢谢python_kaa,将其放在<PropertyGroup>下,在MacOS上运行。 - Peheje
1
我在使用VsCode时遇到了同样的问题,添加<LangVersion>latest</LangVersion>对我没有起作用。我需要明确指出版本号,所以...在<PropertyGroup>中添加<LangVersion>7.2</LangVersion>解决了我的问题。 - Rafael Miceli

11

2
我们是否仍需要选择“C#最新小版本”才能使其与目标框架为.Net Framework 4.7一起工作?我有VS 2017 15.3.3,但除非我在高级构建设置下切换到最新的小版本,否则会出现编译错误。 - Steve Young
@Steve Young,编译器对目标框架一无所知。C#语言规则(在这种情况下是bug)由“语言版本”确定,而不是目标框架。 此bug已在15.3.2中修复,因此如果您仍然可以在15.3.3上重现,请重新打开链接的问题或打开一个新问题。谢谢。 - Julien Couvreur

11

看起来这是C# 7.1的一个重大改变(正如@JulienCouvreur所指出的那样,这实际上是一个错误,但下面的解决方法仍然有效)。


解决方法

尝试为items(即列表实例)显式地赋予名称(例如使用来自IList<(string, bool)> items的相同名称items以保持一致性)。

var group = (Guid.NewGuid(), items: items);

不,这是一个错误。规范中描述的破坏性更改涉及扩展方法,该方法被新命名的字段隐藏。 - Julien Couvreur
嘿,@JulienCouvreur,谢谢你让我知道!我以为它们有关系,但显然你比我更了解这个。 :) - Justin XL

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