隐式算子

时间:2009-03-01 00:21:48

标签: c# implicit-conversion implicit-cast

我刚刚看到它在最近的一个答案中使用了:

public static implicit operator bool(Savepoint sp)
{
    return sp != null;
}

为什么我们在这里需要单词隐含,这是什么意思?

5 个答案:

答案 0 :(得分:29)

隐式意味着转换不需要在代码中使用强制转换。

您现在可以执行此操作:

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

答案 1 :(得分:9)

这看起来像是误用了隐式运算符。我不知道Savepoint类的功能,但将其转换为布尔值似乎不合逻辑。隐式运算符使您可以通过简单地评估引用来检查Savepoint引用是否为null:

if (point) {

而不是:

if (point != null) {

如果以这种方式使用它,那就是隐藏了代码实际正在做的事情,这几乎与C#的所有内容相悖。

答案 2 :(得分:2)

只是添加到mquander的答案。

来自C#3.0语言规范:

  

转换运算符声明   包含implicit关键字   引入了用户定义的隐式   转换。隐式转换可以   发生在各种情况下,   包括函数成员调用,   演员表达和作业。

(第10.10.3节)

答案 3 :(得分:1)

转换运算符从一种类型转换为另一种类型。隐式意味着您不必在代码中键入显式转换以进行转换,显式要求在代码中强制转换。

如果您确定转换不会丢失任何数据,则使用隐式转换运算符。例如,使用加宽强制(int - > long,float - > double)。当某些状态丢失或您不希望编译器通过在整个地方插入转换来自动搞砸客户端代码时,将使用显式转换运算符。

像你这样的转换真的会造成严重破坏,因为执行此特定转换是不可取的。

答案 4 :(得分:0)

你需要指定'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;

否则我建议你定义显式运算符!