无法获取 C# 默认接口方法进行编译
Can't get C# default interface method to compile
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 does not contain a definition for 'GetItNow()'...
因此,编译器对 MyClass
没有显式引用 GetItNow()
这一事实很满意(它不会抱怨 MyClass
没有实现接口)。但它没有将默认接口成员视为实现接口的 class 的 public 方法。
我是不是遗漏了什么,或者什么东西坏了?
好吧,接口默认方法属于接口而不是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());
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 does not contain a definition for 'GetItNow()'...
因此,编译器对 MyClass
没有显式引用 GetItNow()
这一事实很满意(它不会抱怨 MyClass
没有实现接口)。但它没有将默认接口成员视为实现接口的 class 的 public 方法。
我是不是遗漏了什么,或者什么东西坏了?
好吧,接口默认方法属于接口而不是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());