如何允许隐式转换?

mpe*_*pen 12 c#

给出一些像这样的代码:

class Json
{
}

class Program
{
    static void Main(string[] args)
    {
    }

    Json MyAction()
    {
        return "{\"json\": 1}";
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么东西可以添加到Json类中进行编译吗?有什么东西让编译器知道它可以隐式地将字符串转换为Json?

Rex*_*x M 36

implicitc#中的操作符声明允许您指定:

{type to convert to} ({type to convert from} variablename)
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子:

class Json
{
    private Json(string json)
    {
        //logic to parse string into object
    }

    public static implicit operator Json(string input)
    {
        return new Json(input);
    }
}
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 首先,我不一定会走这条路,因为应用程序中的大多数字符串在语义上都不等同于JSON字符串.转换运算符的目的是说两种类型总是表示语义上等效的信息(或者足够接近于语义上等同于被有效地处理的信息).我建议在你的Json类上实现一个static Json Parse(string input)或者甚至一个static bool TryParse(string input, out Json json)方法.通常,callsite应该知道它是否希望自己的字符串包含Json.

  • 通常,如果我的类提供了类型的隐式类型转换,我发现最好为同一类型进行任何解析或ctor逻辑private.这确保了消费者只有一种方式可以做某件事,而不是两种方式(ctor和转换) - 因此上面例子中的私人ctor.可以有例外,但这对我来说是一个很好的一般规则.

  • 隐式转换还允许使用比较运算符进行一些有趣的事情.例如,现在您可以隐式地将字符串转换为json,您也可以执行以下操作:if(myJson == "blah")它将执行转换,然后==在Json对象上调用运算符,默认情况下将执行引用相等性比较.