繁体   English   中英

隐式运算符

[英]implicit operator

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

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 类的作用,但将其转换为布尔值似乎不合逻辑。 隐式运算符使您能够通过简单地评估引用来检查保存点引用是否为空:

if (point) {

代替:

if (point != null) {

如果以这种方式使用,就会隐藏代码实际执行的操作,这与 C# 的几乎所有内容背道而驰。

只是为了补充 mquander 的答案。

来自 C# 3.0 语言规范:

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

(第 10.10.3 节)

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

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

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

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

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

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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM