编译器看不到接口的默认实现吗?

Chr*_*lin 3 c# c#-8.0 default-interface-member

这是我的AC#项目中的代码,该代码针对Visual Studio 2019(16.3.9)的.NET Core 3.0(因此我应该在C#8.0中)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

编译错误是:

CS1061'SumRequest'不包含'ToJson'的定义,并且找不到可以接受的扩展方法'ToJson'接受类型为'SumRequest'的第一个参数(您是否缺少using指令或程序集引用?)

有人可以阐明这种行为吗?

Dav*_*idG 6

方法仅在接口上可用,而在上不可用。因此,您可以这样做:

IJsonAble request = new SumRequest()
var result = request.ToJson();
Run Code Online (Sandbox Code Playgroud)

要么:

((IJsonAble)new SumRequest()).ToJson();
Run Code Online (Sandbox Code Playgroud)

这样做的原因是它允许您添加到界面中,而不必担心下游后果。例如,该ToJson方法可能已经存在于SumRequest类中,您希望将其调用吗?

  • > “...您希望被称为哪个?” 类实现的。如果该类未实现该方法,则应调用接口中定义的默认方法。推理起来并不难。这个消息令人非常失望。 (5认同)
  • 按顺序调用两者是一场灾难。但在这些情况下,编译器可能会强制继承类指定它正在调用哪个类(或实现它自己的类)。此功能在当前状态下无用 (2认同)