【问题标题】:Can't get C# default interface method to compile无法获取 C# 默认接口方法进行编译
【发布时间】:2020-05-10 19:31:38
【问题描述】:

C# 8.0 有一个新功能,可让您add a default implementation to a method on an interface。要么我做错了,要么这个功能不像宣传的那样工作。 (我猜是前者。)

我使用以下代码创建了一个新的 .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 没有实现接口)。但它不会将默认接口成员视为实现该接口的类的公共方法。

是我遗漏了什么,还是有什么坏了?

【问题讨论】:

  • Console.WriteLine((xxx as ITest).GetItNow())); 默认 interface 方法仅属于 interface(不属于实现它的 class);这就是为什么演员(xxx as ITest 或类似的)在这里是强制性的。 ITest xxx = new MyClass { MyInt = 5 }; 是另一种选择(现在 xxx 被声明为 interface
  • 哦!谢谢!是的,“文档”(实际上是一个过于复杂的教程)提到了这样一个事实,即为了访问默认接口成员,您必须将对象引用转换为接口。所以这个编译:Console.WriteLine(((ITest)xxx).GetItNow());

标签: c# c#-8.0 default-interface-member


【解决方案1】:

嗯,interface 默认方法属于interface,而不是属于实现它的class;所以你有两种可能:

演员:

  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());

【讨论】:

  • 我建议使用第二种方法 - 一种是编译时安全的!
猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
相关资源
最近更新 更多