获取“推断元组元素名称。请使用语言版本 7.1 或更高版本通过推断名称访问元素。”

Posted

技术标签:

【中文标题】获取“推断元组元素名称。请使用语言版本 7.1 或更高版本通过推断名称访问元素。”【英文标题】:Getting "Tuple element name is inferred. Please use language version 7.1 or greater to access an element by its inferred name." 【发布时间】:2018-01-22 21:01:34 【问题描述】:

在我们将 Visual Studio 2017 更新到最新的 15.3 之后,直到今天,我们的 UWP 应用程序中的以下代码一直运行良好。

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);

没有错误消息,但在输出窗口中

推断元组元素名称“items”。请使用语言版本 7.1 或更高版本通过推断名称访问元素。

知道为什么以及如何解决这个问题吗?

【问题讨论】:

@itsme86 好吧,我不能只升级它以使用 C#7.1,因为它是一个 UWP 应用程序。 这与您的问题无关,但像 new List&lt;(Guid key, IList&lt;(string, bool)&gt; items)&gt; 这样的类型可以产生体面的用例 反对 元组。除了添加项目之外,没有任何操作是有效或明显的——考虑一下你是否不想要像Dictionary&lt;Guid, HashSet&lt;string&gt;&gt; 这样的东西。 (显然,正确的类型完全取决于您的用例,但元组的嵌套列表往往不是。) @itsme86 你知道如何指定语言版本 7.1 吗?我假设这实际上只是与预览相关的错误消息,在非预览版 Visual Studio 2017 中尚不可用。 @Jessica 迁移到 C# 7.1 对于 UWP 应用程序应该没问题。 C# 7.1 编译器已在使用,语言版本标志仅控制可用功能。 @JaredPar 你能告诉我怎么做吗? 【参考方案1】:

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

【讨论】:

谢谢!这实际上在没有解决方法的情况下有效。我不知道我能做到这一点。 在极少数情况下您没有 Visual Studio,只需将 &lt;LangVersion&gt;latest&lt;/LangVersion&gt; 添加到您的 csproj 文件中 感谢 python_kaa,将其放在 下并在 MacOS 上运行 我在使用 VsCode 时遇到了同样的问题,然后添加 &lt;LangVersion&gt;latest&lt;/LangVersion&gt; not 对我有用。我需要明确,所以...在&lt;PropertyGroup&gt; 中添加&lt;LangVersion&gt;7.2&lt;/LangVersion&gt; 为我解决了。【参考方案2】:

这是一个已确认的错误,在 15.3 中引入。该修复程序将作为服务版本 (15.3.2) 的一部分提供。

问题在https://github.com/dotnet/roslyn/issues/21518进行跟踪

【讨论】:

我们是否还需要选择“C# 最新次要版本”才能使用 .Net Framework 4.7 的目标框架?我有 VS 2017 15.3.3 但我得到编译错误,除非我在高级构建设置下切换到最新的次要版本。 @Steve Young,编译器对目标框架一无所知。 C# 语言规则(在这种情况下是错误)由“语言版本”决定,而不是目标框架。此错误已在 15.3.2 中修复,因此如果您仍然可以在 15.3.3 上重现,请重新打开链接的问题或打开一个新问题。谢谢【参考方案3】:

看起来这是 C# 7.1 中的 breaking change。(正如 @JulienCouvreur 所指出的,这实际上是一个错误,但下面的解决方法应该仍然有效不过)。


解决方法

尝试给items(即列表实例)显式地赋予一个名称(例如,使用与IList&lt;(string, bool)&gt; items 相同的名称items 以保持一致)。

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

【讨论】:

不,这是一个错误。规范中描述的重大更改涉及一个扩展方法,该方法被新命名的字段隐藏。 嘿@JulienCouvreur 感谢您告诉我!我认为它们是相关的,但显然你比我更清楚这一点。 :)

以上是关于获取“推断元组元素名称。请使用语言版本 7.1 或更高版本通过推断名称访问元素。”的主要内容,如果未能解决你的问题,请参考以下文章

java反射获取属性值

Shell 获取路径

iOS 获取文件大小

根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期

js如何获取时间点?

iOS 获取设备的各种信息的方法