【问题标题】:When to use keyword "implicit" or "explicit" when overloading conversion operators? [duplicate]重载转换运算符时何时使用关键字“隐式”或“显式”? [复制]
【发布时间】:2015-01-06 13:24:20
【问题描述】:

我现在正在学习 C#。本教程没有明确说明在重载转换运算符时何时使用关键字implicitexplicit

它提供的例子是这样的:

Class1 包含int 类型的字段并且Class2 包含double 类型的字段时,我们应该定义从Class2Class1 的显式转换,以及从@987654329 的隐式转换@到Class2

教程没有说明如果我使用了错误的关键字会发生什么。

但是如果Class1 包含一个复杂的子类,而Class2 包含一个不同的子类,我应该在implicitexplicit 之间使用哪个关键字?谁能给个明确的解释?非常感谢。

【问题讨论】:

  • 我不认为这是完全重复的。一个问题是为什么 float 到 double 隐式转换和 double 到 float 显式转换。虽然链接问题的答案对提问者很有价值,但答案并不准确。
  • 是的,“重复”真的很糟糕!
  • 我同意。我不会说它是重复的。另一个问题解释了如何做到这一点,而这个问题是关于何时可能有用。

标签: c# type-conversion overloading


【解决方案1】:

隐式转换:不需要特殊语法,因为 转换是类型安全的,不会丢失任何数据。例子包括 从较小的整数类型到较大的整数类型的转换,和转换 从派生类到基类

显式转换(强制转换):

显式转换需要强制转换运算符。需要铸造时 信息可能会在转换中丢失,或者在转换时 可能由于其他原因而无法成功。典型的例子包括数字 转换为精度较低或范围较小的类型,和 将基类实例转换为派生类。

检查此说明中的粗体文本。这是MSDN中的详细文章

这是一个小代码示例:

// Create a new derived type.
Giraffe g = new Giraffe();

// Implicit conversion to base type is safe.
Animal a = g;

// Explicit conversion is required to cast back
// to derived type. Note: This will compile but will
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe) a;

【讨论】:

  • 我明白了。它用于提醒开发人员明智地使用用户定义类型之间的转换,并且强制执行显式转换是告诉开发人员“您正在使用的转换可能会导致丢失原始数据”。非常感谢
  • @ZhuShengqi:_您使用的转换可能会导致丢失原始数据_这可能是真的,但不是必须的。由于我没有机会发布我自己的答案,因此我会尝试在此处几句话来解释这一点。例如,如果您想创建一个帮助类以方便起见,您将使用隐式操作,例如更好的 Color 类,该类可以与 .net 结构不同的是可以序列化和反序列化,并且可以在您通常使用 Color 的任何地方使用它结构,您可以扩展您的 BetterColor,以便能够隐式转换为颜色。
  • @t3chb0t:非常感谢。您的意思是隐式转换还可以使派生类在改进旧项目和其他情况下更可重用。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2012-08-21
  • 1970-01-01
  • 2012-02-11
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多