使用C#7.0中的元组和字段名称规则覆盖方法

Zei*_*kki 6 c# overriding c#-7.0

我正在阅读此页面,该页面在Visual Studio 17 RC 的发行说明中正式引用,它声明如下:

出于重载覆盖隐藏的目的,相同类型和长度的元组以及它们的基础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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误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功能文档吗?

svi*_*ick 4

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

据我所知,该文档已经过时了。该文档自 2016 年 4 月以来没有发生重大变化,而您收到的错误(ERR_CantChangeTupleNamesOnOverride在 Roslyn 源代码中)是在 2016 年 8 月引入的(不要被不同的错误代码混淆,后来更改了)。

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

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

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

考虑到 C# 7.0 仍在开发中,文档是一个问题。.Net 官方文档中一篇关于元组的文章目前正在审查中,尽管它根本没有提到这些问题。

因此,您找到的过时文档可能是目前最好的来源。我创建了一个问题,要求更新文档。