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

Default implementation in interface is not seen by the compiler?

这是我在一个 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' does not contain a definition for 'ToJson' and no accessible extension method 'ToJson' accepting a first argument of type 'SumRequest' could be found (are you missing a using directive or an assembly reference?)

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

方法仅适用于 界面,不适用于 class。所以你可以这样做:

IJsonAble request = new SumRequest()
var result = request.ToJson();

或者:

((IJsonAble)new SumRequest()).ToJson();

这样做的原因是它允许您添加到接口而不用担心下游后果。例如,ToJson 方法可能已经存在于 SumRequest class 中,您希望调用哪个方法?

尝试使用 (new SumRequest() as IJsonAble).ToJson(); 来帮助编译器。

无论如何,假设您想在当前 SumRequest 实例上应用 ToJson,我确定您想要的是 (this as IJsonAble).ToJson()