【发布时间】:2020-03-15 23:09:49
【问题描述】:
这是我在 c# 项目中的代码,该项目针对 .NET Core 3.0(所以我应该使用 C# 8.0)和 Visual Studio 2019 (16.3.9)
public interface IJsonAble
{
public string ToJson() => System.Text.Json.JsonSerializer.Serialize(this);
}
public class SumRequest : IJsonAble
{
public int X { get; set; }
public int Y { get; set; }
public void Tmp()
{
new SumRequest().ToJson(); //compile error
}
}
编译错误是:
CS1061“SumRequest”不包含“ToJson”的定义,并且找不到接受“SumRequest”类型的第一个参数的可访问扩展方法“ToJson”(您是否缺少 using 指令或程序集引用?)
有人能解释一下这种行为吗?
【问题讨论】:
-
即使使用 C# 8.0,该类也不会从接口继承实现。您必须强制转换为接口类型才能使用默认实现。
-
虽然 C# 8 允许在接口中实现具体的方法 (stackoverflow.com/a/45912519/3759822),但我仍然认为 OOP 方面不是一个好主意,我建议你将
interface IJsonAble更改为abtract class AbstractJsonAble。我知道此评论与您的问题没有直接关系,记住这一点可能会有所帮助。 -
遇到了同样的问题,这是心理问题!我的意思是默认 impl 的全部目的。在接口上是我们不再需要在我们自己的接口上添加通用功能作为扩展。如果这应该更接近于任何意义,那么通过对实现类型的引用,既不应该看到常规接口方法,也不应该看到接口的扩展。我真的很想看看这个决定背后的原因。
-
@jool 原因是“它允许您添加到界面而不用担心下游后果”(见接受的答案)
标签: c# c#-8.0 default-interface-member