如何允许隐式转换?

时间:2011-01-02 19:29:49

标签: c#

给出一些像这样的代码:

class Json
{
}

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

    Json MyAction()
    {
        return "{\"json\": 1}";
    }
}

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

3 个答案:

答案 0 :(得分:35)

c#中的implicit运算符声明允许您指定:

{type to convert to} ({type to convert from} variablename)

这是一个简单的例子:

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

    public static implicit operator Json(string input)
    {
        return new Json(input);
    }
}

一些注意事项:

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

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

  • 隐式转换还允许使用比较运算符进行一些有趣的操作。例如,现在您可以隐式地从string转换为json,您也可以执行:if(myJson == "blah")并执行转换,然后在Json对象上调用==运算符,默认情况下这样做参考相等比较。

答案 1 :(得分:4)

添加implicit运算符:

public static implicit operator Json(string s)
{
   return new Json(s);
}
  

implicit关键字用于声明隐式用户定义的类型转换运算符。如果保证转换不会导致数据丢失,则使用它来启用用户定义类型与其他类型之间的隐式转换。

答案 2 :(得分:3)

您可以拥有隐式转换器但请注意不要丢失数据:

  

通过消除不必要的演员阵容,   隐式转换可以改进   源代码可读性。然而,   因为隐式转换可能会发生   没有程序员的指定   他们必须小心谨慎   令人不快的惊喜。一般来说,   隐式转换运算符应该   从不抛出异常,永不丢失   信息,以便他们可以使用   没有程序员的安全   意识。如果是转换运算符   它应该不符合那些标准   明确标记。

请参阅MSDN