1

C# 8.0 有一个新功能,允许您将默认实现添加到接口上的方法。要么我做错了,要么这个功能不像宣传的那样工作。(我猜是前者。)

我使用以下代码创建了一个新的 .NET Core 3.1 控制台应用程序:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var xxx = new MyClass { MyInt = 5 };
            Console.WriteLine(xxx.GetItNow());
        }
    }

    public interface ITest
    {
        int MyInt { get; set; }
        int GetItNow() => MyInt * 2;
    }

    public class MyClass : ITest
    {
        public int MyInt { get; set; }
    }
}

Console.WriteLine(xxx.GetItNow()));语句无法编译,因为

Myclass 不包含“GetItNow()”的定义...

MyClass因此,编译器对没有显式引用的事实感到满意GetItNow()(它不会抱怨MyClass没有实现接口)。但它不会将默认接口成员视为实现该接口的类的公共方法。

我错过了什么,还是有什么坏了?

4

1 回答 1

4

好吧,接口默认方法属于接口而不是实现它的类;所以你有两种可能性:

投掷:

  Console.WriteLine(((ITest)xxx).GetItNow()));

声明更改(最好;MyClass实现细节,通常是依赖项ITest-合同是唯一重要的事情):

  ITest xxx = new MyClass { MyInt = 5 };
  // xxx is ITest, so xxx.GetItNow() is legal now 
  Console.WriteLine(xxx.GetItNow());
于 2020-05-10T19:52:50.100 回答