繁体   English   中英

为什么 C# 允许我将默认接口实现声明为“密封”,但这样做时却表现不一致?

[英]Why does C# allow me to declare a default interface implementation as “sealed”, but then behave inconsistently when I do?

新的 C# .NET 核心控制台应用程序:

using System;

namespace Interface_Sealed
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(new C().X);
            Console.WriteLine((new C() as I).X);
            Console.ReadKey();
        }

        interface I
        {
            sealed int X => 0;
        }

        class C: I
        {
            public int X => 1;
        }
    }
}

运行时,这会将“10”打印到控制台。 第一个“.X”是调用class C中X的实现,第二个是调用接口I上的默认实现。

为什么 C# 允许我将 X 的默认实现声明为“密封”,然后允许我用不同的实现覆盖它而不抱怨? 为什么我通过类型 I 或类型 C 的引用访问 X 会有所不同?

注意。 如果您在 C 中显式地而不是隐式地实现 IX,您会得到 CS0539“'Program.C.X' 在显式接口声明中找不到在可以实现的接口的成员中”。 此错误的 Microsoft 文档页面指出,当“尝试 [is] 显式声明不存在的接口成员”时会发生此错误。 好吧,这不是真的,是吗? 它确实存在。

为什么 C# 允许我将 X 的默认实现声明为“密封”,然后允许我用不同的实现覆盖它而不抱怨?

它没有。 您没有覆盖该成员,只是创建了一个具有相同名称的新成员。 当类型是接口类型时,调用返回1的成员这一事实证明了这一点。 这与从另一个继承的类中的密封成员完全一致。 您并没有阻止实现接口的 class 拥有具有该名称和签名的自己的成员,您只是阻止它成为与接口(或基类)关联的成员。

为什么我通过类型 I 或类型 C 的引用访问 X 会有所不同?

因为IC都有两个不同的成员,碰巧有相同的名称和签名,但行为不同。 只有当您能够覆盖接口的成员时,它们才会具有相同的行为,从而在通过接口调用时更改成员的行为。

好吧,这不是真的,是吗?

不,这是真的。 该成员不是可以实现的成员,因为它是密封的。 该成员在那里,但您不能更改它的实现,因此会出现错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM