【问题标题】:"if (object is (string, Color))" c# 7.0 tuple usage doesn't work“if (object is (string, Color))” c# 7.0 tuple 用法不起作用
【发布时间】:2017-04-11 11:19:11
【问题描述】:

我正在使用 Visual Studio 2017 RC,并且我已经安装了 System.ValueTuple 包,它启用了新的 c# 7.0 元组使用,但我无法使其在这种特定情况下工作:

如您所见,第一种方法没有任何红色波浪线,并且可以正常工作。但是尝试执行 o is (string, Color) 失败并出现不相关的错误:

不能这样使用新的元组吗?或者它只是包的当前状态?顺便说一句,我已将其更新到最新版本,目前是 4.3.0。我读过this MSDN post,但没有发现任何这样的用法。

【问题讨论】:

  • nuget 包仅提供必要的类型,它不提供处理此问题的编译器部分,因此虽然 Nuget 包是使用元组所必需的,但它与您的错误消息无关'得到。
  • 为了将来的参考,最好将代码和错误消息以文本而不是屏幕截图的形式发布,这样其他人(例如我)可以更轻松地试验代码并分析结果。
  • 出于好奇:“o is Tuple”有效吗?
  • @Dyrborg 它将编译但意味着别的,因为新的元组类型为ValueTuple<...>,而不是Tuple<...>。话虽如此,执行o is ValueTuple<string, Color> 工作并返回true
  • 还要注意 if 语句与此无关,只是这个表达式由于某种原因是非法的:o is (string, Color)

标签: c# tuples visual-studio-2017 c#-7.0


【解决方案1】:

Roslyn contains tests that ensure using tuples in pattern matching does cause errors(在this PR 中添加,没有解释任何内容),所以目前看来这是预期的行为。我不确定这是什么原因,或者 C# 7.0 的最终版本是否计划这样做。这当然是我期望的工作。

【讨论】:

    【解决方案2】:

    从 C# 7 版本中删除了一些模式匹配功能。这包括元组的模式匹配。这被拉出并放入未来的分支中。 (https://github.com/dotnet/roslyn/issues/10866)

    这意味着更高级的模式匹配(由 reddit 海报 wreckedadvent 有效解释)在 C# 7 中将不可用,包括:

    • 递归模式形式,例如位置模式(例如,p 是 Person("Mickey", *)、属性模式(例如,p 是 Person {FirstName is "Mickey"})、元组模式、通配符 * 等。

    来源:https://www.infoq.com/news/2016/05/csharp7-pattern-matching-removed

    更新: 类型测试(int, int) 可以解释为元组模式。例如,如果您想进行类型测试并将结果绑定到变量。所以类型测试涉及到元组模式。例如(int x, int y) 可以是类型测试或元组模式。请参阅 github 上的模式匹配讨论:https://github.com/dotnet/roslyn/issues/11744

    【讨论】:

    • 我不明白为什么模式匹配删除也删除了o is Type 的某些情况,在这种情况下Type 是一个元组。看起来编译器非常努力地掩盖(T1, T2) 真的只是ValueType<T1, T2> 的事实,并且在某些情况下某些属性是假成员名称,然后在is 运算符的情况下,只是采取了支持出去。再说一次,我没有深入阅读 C# 7 文档或实现,但我觉得奇怪的是这个特定部分与更高级的模式匹配相关。
    • 特别是因为o is ValueType<string, Color> 确实有效。
    • 我不知道具体的实现细节,但我认为您在谈论与星号符号匹配的模式,它似乎是一个单独的功能,应该对这个更常见的功能没有影响。
    • @LasseV.Karlsen 这与(高级)模式匹配相关的原因对我来说也是未知的。因为这看起来像 user1306322 描述的一个常见功能。这是我在描述此案例的 PR 中发现的:This one is a little worrying. It suggests that (1, 2) is being parsed as a tuple expression, which should not be possible in this context. But that will have to be sorted out later when we parse tuple patterns.
    • @user1306322 在元组的设计会议上做了一些挖掘并更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2018-01-25
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多