22

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

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

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

4

5 回答 5

32

隐式意味着转换不需要在您的代码中进行强制转换。

您现在可以这样做:

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
于 2009-03-01T00:25:03.963 回答
9

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

if (point) {

代替:

if (point != null) {

如果以这种方式使用,那就是隐藏代码实际在做什么,这与 C# 的几乎所有内容背道而驰。

于 2009-03-01T01:38:36.267 回答
2

只是为了增加 mquander 的答案。

来自 C# 3.0 语言规范:

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

(第 10.10.3 节)

于 2009-03-01T00:29:48.287 回答
1

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

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

像您这样的转换确实会造成严重破坏,因为不建议执行这种特定的转换。

于 2009-03-01T09:10:55.070 回答
0

您需要指定“隐式”,因为还有显式运算符。

这意味着 Boolean 和 Savepoint 之间的转换可以隐式完成,例如 = hidden。

Savepoint s = new Savepoint();
bool b = s;

显式转换,例如明显的,可以这样完成:

 Savepoint s = new Savepoint();
 bool b = (bool)s;

当没有可能的数据丢失时,通常使用隐式转换,Int16 (short)Int32 (int). 但如果可能,您需要使用显式转换“同意”它。

例如,在您的情况下, ifSavepoint只是

struct Savepoint
{
  public bool data;
}

您可以使用隐式转换,因为不会丢失数据:

Savepoint s = new Savepoint();
s.data = true;
bool b = s;

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

于 2009-03-01T00:38:50.327 回答