【问题标题】:Overriding Methods with Tuples and Field Name Rules in C# 7.0在 C# 7.0 中使用元组和字段名称规则覆盖方法
【发布时间】:2016-11-27 16:49:47
【问题描述】:

我正在阅读这个page,它在Visual Studio 17 RC 的release notes 中被正式引用,它声明如下:

为了重载覆盖隐藏,相同的元组 类型和长度以及它们的底层 ValueTuple 类型是 被认为是等价的。所有其他差异都无关紧要。

当覆盖一个成员时,允许使用相同的元组类型 或与基成员中不同的字段名称。

相同字段名称用于不匹配字段的情况 在基成员签名和派生成员签名之间,会报告警告 编译器

试一试时:

public abstract class Foo
{
    public abstract void AbstractTuple((int a, string b) tuple);

    public virtual void OverrideTuple((int a, string b) tuple)
    {
        Console.WriteLine($"First= {tuple.a}  Second = {tuple.b}");
    }
}

public class Bar : Foo
{
    public override void AbstractTuple((int c, string d) tuple)
    {
        Console.WriteLine($"First= {tuple.c}  Second= {tuple.d}");
    }

    public override void OverrideTuple((int c, string d) tuple)
    {
        base.OverrideTuple(tuple);
    }
}

我收到以下错误:

错误 CS8139 'Bar.AbstractTuple((int c, string d))': 无法更改 覆盖继承成员时的元组元素名称 'Foo.AbstractTuple((int a, string b))'

错误 CS8139 'Bar.OverrideTuple((int c, string d))': 无法更改 覆盖继承成员时的元组元素名称 'Foo.OverrideTuple((int a, string b))'

问题是:

  1. 官方设计的注释有错吗?或者这是一种尚未在官方 C# 7.0 版本中实现的行为?

  2. 如果这是正确的行为,在被覆盖的方法中元组字段名称必须相同是否有意义?请记住,具有相同元组 (int a, int b)(int c, int d) 的两个方法不会被视为重载候选者并会产生错误!

  3. 我们是否有官方的 C# 7.0 功能文档?

【问题讨论】:

  • 您观察到的行为是正确的。我不记得哪个 LDM 包含了这个决定。但我会在接下来的一两周内更新功能设计。敬请关注github.com/dotnet/roslyn/blob/master/docs/features/tuples.md
  • FWIW,我在尝试生成使用 System.ValueTuple 的伪造程序集时看到此错误。

标签: c# overriding c#-7.0


【解决方案1】:

是不是官方设计的注释有误?或者这是一种尚未在官方 C# 7.0 版本中实现的行为?

据我所知,文档已过时。 That document hasn't significantly changed since April 2016,而你得到的错误(ERR_CantChangeTupleNamesOnOverride 来自 Roslyn 源代码)was introduced in August 2016(不要被不同的错误代码混淆,稍后会更改)。

如果这是正确的行为,在被覆盖的方法中元组字段名称必须相同是否有意义?请注意,具有相同元组 (int a, int b)(int c, int d) 的两个方法不会被视为重载候选并会产生错误!

是的,这似乎是新的预期行为。

我们在某处有官方的 C# 7.0 特性文档吗?

考虑到 C# 7.0 仍在开发中,文档是一个问题。 .Net 官方文档is currently under review 中有一篇关于元组的文章,虽然它根本没有提到这些问题。

因此,您找到的过时文档可能是目前最好的来源。 I have created an issue asking for the documentation to be updated.

【讨论】:

  • 知道为什么做出这个决定吗?试图回到问题并检查它,但似乎没有写下原因。有什么问题吗?
  • 我也找不到任何东西。 PR 提到“LDM 7/15”,但the design notes for that date 不谈论这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2021-03-08
  • 2015-05-19
  • 2018-11-11
  • 2011-07-17
  • 2011-04-19
相关资源
最近更新 更多