【发布时间】: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