当我在从该接口派生的类中调用它时,为什么需要将“this”转换为在 C# 8.0 中具有默认实现的接口?

use*_*224 3 c# .net-core c#-8.0 default-interface-member

我在 .NET Core 3.1 和 C# 8 中有这个简单的控制台程序:

using System;

namespace ConsoleApp34
{

    public interface ITest
    {
        public void test()
        {
            Console.WriteLine("Bye World!");

        }
    }

    public class Test : ITest
    {
        public void CallDefault()
        {
            ((ITest)(this)).test();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var t = new Test();
            t.CallDefault();

        }
    }
}

Run Code Online (Sandbox Code Playgroud)

我不明白为什么演员阵容是必要的 ((ITest)(this)).test();

Test 直接派生自 ITest,因此,根据定义,'this' 是 ITest

谢谢你。

Joh*_*lay 7

默认接口实现的工作方式与显式实现类似:它们只能通过接口类型调用,而不能通过实现类型调用。

要理解为什么会这样,想象一下Test实现了 2 个具有相同方法签名的接口;如果没有演员表会使用哪个?

public interface ITest2
{
    public void test()
    {
        Console.WriteLine("Hello World!");
    }
}

public class Test : ITest, ITest2
{
    public void CallDefault()
    {
        test(); // Do we use ITest.test() or ITest2.test()?
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在我的例子中不存在这种歧义。但对于您的示例,语法类似于 'ITest.test();' 和“ITest2.test();” 会消除歧义,同时编译器可以检查错误。如果您使用强制转换,您可以尝试强制转换到该类不继承的接口,从而创建运行时错误而不是编译时错误。 (3认同)