相关疑难解决方法(0)

C# 8.0 默认接口成员的意外行为

考虑以下代码:

interface I {
    string M1() => "I.M1";
    string M2() => "I.M2";
}

abstract class A : I {}

class C : A {
    public string M1() => "C.M1";
    public virtual string M2() => "C.M2";
}

class Program {
    static void Main() {
        I obj = new C();
        System.Console.WriteLine(obj.M1());
        System.Console.WriteLine(obj.M2());
    }
}
Run Code Online (Sandbox Code Playgroud)

它在 .NET Core 3.1.402 中产生以下意外输出:

I.M1
C.M2
Run Code Online (Sandbox Code Playgroud)

A没有 的成员的隐式或显式实现I,所以我希望默认实现用于C,因为C继承了 的接口映射A并且没有显式地重新实现I。根据 ECMA-334 (18.6.6) 和 C# 6.0 语言规范: …

c# interface-implementation c#-8.0 default-interface-member

20
推荐指数
1
解决办法
565
查看次数