题
我刚刚看到它在最近的答案之一中使用:
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
其他提示
这看起来像一个隐含的操作者的误操作。我不知道该保存点班做什么,但它转换成一个布尔似乎不符合逻辑的。隐含运算符可以通过简单地评估所述参考以检查是否保存点参考为空或不是:
if (point) {
,而不是:
if (point != null) {
如果它使用的方法,那就是隐藏什么代码实际上在做,而且违背了几乎一切,C#是什么。
我想补充到mquander的答案。
从C#3.0语言规范:
一个转换运算符声明 包括
implicit
关键字 引入了一个用户定义的隐 转换。隐含的类型转换 发生在各种情况下, 包括函数成员调用, 投表达式和分配。
(第10.10.3)
转换运算符转换从一种类型到另一个。隐意味着你不必键入代码显式转换为发生转换,明确要求在代码中投被调用。
您使用隐式转换操作符,当你有一定的转换不会丢失任何数据。例如,具有加宽的强制(INT - >长整型,浮点 - >双)。显式转换操作符是用来当一些国家将丢失或者你不想编译器插入转换所有的地方自动搞砸了客户端代码。
像您A转换将真正肆虐,因为它是不可取的执行该特定转换。
您需要指定“隐”,因为还没有明确的运营商。
这意味着,布尔和保存点之间的转换可以隐式进行,例如=隐藏。
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;
否则我建议你定义明确的操作!