隐式算子
我刚刚看到它在最近的一个答案中使用:
public static implicit operator bool(Savepoint sp) { return sp != null; }
为什么我们在这里需要含义,这是什么意思?
隐式意味着转换不需要在代码中使用强制转换。
你现在可以这样做:
Savepoint point = new Savepoint(); if(point) // becomes a bool using your operator { }
而不是必须这样做:
Savepoint point = new Savepoint(); if((bool)point) // an "explicit" conversion { }
为什么这是一个有用的区别的一个例子是数字类型。 存在从“较小”类型到“较大”类型的隐式转换,例如:
float f = 6.5; double d = f; // implicit conversion
但是将较大的类型转换为较小的类型可能是危险的,因此只有显式的转换,迫使用户澄清他真的打算执行有问题的操作:
long l = 20; // short s = l; short s = (short)l; // explicit conversion
这看起来像是滥用隐式运算符。 我不知道Savepoint类做了什么,但将其转换为布尔值似乎不合逻辑。 隐式运算符使您可以通过简单地评估引用来检查Savepoint引用是否为null:
if (point) {
代替:
if (point != null) {
如果它以这种方式使用,那就是隐藏了代码实际正在做的事情,这几乎与C#的所有内容相悖。
只是添加到mquander的答案。
从C#3.0语言规范:
包含
implicit
关键字的转换运算符声明引入了用户定义的隐式转换。 隐式转换可以在各种情况下发生,包括函数成员调用,强制转换表达式和赋值。
(第10.10.3节)
转换运算符从一种类型转换为另一种类型 隐式意味着您不必在代码中键入显式强制转换以进行转换,显式要求在代码中强制转换。
当您确定转换不会丢失任何数据时,可以使用隐式转换运算符。 例如,扩大强制(int – > long,float – > double)。 当某些状态丢失或者您不希望编译器通过在整个地方插入转换来自动搞砸客户端代码时,将使用显式转换运算符。
像你这样的转换真的会造成严重破坏,因为执行这种特殊转换是不可取的。
您需要指定’implicit’,因为还有显式运算符。
这意味着布尔值和保存点之间的转换可以隐式完成,例如=隐藏。
Savepoint s = new Savepoint(); bool b = s;
显式转换,例如明显,可以这样做:
Savepoint s = new Savepoint(); bool b = (bool)s;
当没有可能的数据丢失时,通常使用隐式转换,即Int16 (short)
到Int32 (int)
。 但如果可能的话,你需要使用显式转换来“同意”它。
在您的情况下,例如,如果Savepoint
只是一个
struct Savepoint { public bool data; }
您可以使用隐式转换,因为不可能丢失数据:
Savepoint s = new Savepoint(); s.data = true; bool b = s;
否则我建议你定义显式运算符!