【发布时间】: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))'
问题是:
官方设计的注释有错吗?或者这是一种尚未在官方 C# 7.0 版本中实现的行为?
如果这是正确的行为,在被覆盖的方法中元组字段名称必须相同是否有意义?请记住,具有相同元组
(int a, int b)和(int c, int d)的两个方法不会被视为重载候选者并会产生错误!我们是否有官方的 C# 7.0 功能文档?
【问题讨论】:
-
您观察到的行为是正确的。我不记得哪个 LDM 包含了这个决定。但我会在接下来的一两周内更新功能设计。敬请关注github.com/dotnet/roslyn/blob/master/docs/features/tuples.md
-
FWIW,我在尝试生成使用
System.ValueTuple的伪造程序集时看到此错误。
标签: c# overriding c#-7.0