C# 8.0有一个新功能,允许您在接口方法中添加默认实现。我要么做错了什么,要么这个功能不像广告中宣传的那样工作。(我猜是前者。)
我创建了一个新的.NET Core 3.1控制台应用程序,并编写了以下代码:
"
我创建了一个新的.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()));
这段代码中的默认接口方法属于接口而不是实现它的类,所以必须使用强制类型转换(如xxx as ITest
) 。另外一种选择是声明xxx
为接口类型,例如ITest xxx = new MyClass { MyInt = 5 };
。请注意,这仅仅是将xxx
声明为接口类型,并不会改变其实际类型。 - Dmitry BychenkoConsole.WriteLine(((ITest)xxx).GetItNow());
- Bob.at.Indigo.Health