给出一些像这样的代码:
class Json
{
}
class Program
{
static void Main(string[] args)
{
}
Json MyAction()
{
return "{\"json\": 1}";
}
}
我可以添加到Json
类来进行编译吗?是什么让编译器知道它可以隐式地将字符串转换为Json?
答案 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