12

这是我在 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
    }
}

编译错误是:

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

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

4

2 回答 2

17

方法只在接口上可用,在上不可用。所以你可以这样做:

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

或者:

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

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

于 2019-11-20T09:30:12.383 回答
1

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

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

于 2019-11-20T09:30:40.407 回答