c# - 什么时候应该在 C# 中定义(显式或隐式)转换运算符?

标签 c# casting operator-overloading implicit-conversion explicit-conversion

<分区>

C# 的一个鲜为人知的特性是可以创建隐式或显式 user-defined type conversions . 我已经编写 C# 代码 6 年了,但我从未使用过它。所以,我担心我可能会错失良机。

用户定义的转换的合法、良好用途是什么?您是否有比仅定义自定义方法更好的示例?

--

事实证明,Microsoft 有一些 design guidelines关于转化,其中最相关的是:

Do not provide a conversion operator if such conversion is not clearly expected by the end users.

但是什么时候“预期”会发生转化?在玩具数字类之外,我想不出任何真实世界的用例。


以下是答案中提供的示例的摘要:

  • 弧度/度数/双
  • 极坐标/Point2D
  • 开尔文/华氏/摄氏

模式似乎是:隐式转换主要(仅?)在定义数字/值类型时有用,转换由公式定义。回想起来,这是显而易见的。不过,我想知道非数字类是否也可以从隐式转换中受益......?

最佳答案

当存在与不同类型之间的自然而明确的转换时,您可以使用转换运算符。

例如,假设您有一个表示温度的数据类型:

public enum TemperatureScale { Kelvin, Farenheit, Celsius }

public struct Temperature {

  private TemperatureScale _scale;
  private double _temp;

  public Temperature(double temp, TemperatureScale scale) {
    _scale = scale;
    _temp = temp;
  }

  public static implicit operator Temperature(double temp) {
    return new Temperature(temp, TemperatureScale.Kelvin);
  }

}

使用隐式运算符,您可以将 double 值分配给温度变量,它会自动用作开尔文:

Temperature a = new Temperature(100, TemperatureScale.Celcius);
Temperature b = 373.15; // Kelvin is default

关于c# - 什么时候应该在 C# 中定义(显式或隐式)转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126907/

相关文章:

c# - 在 MVC 中自动格式化内联代码

c++ - 直接在 foreach 循环中强制转换

javascript分配属性语句返回父对象

c++ - 为什么不能重载三元运算符?

c# - 如何使用 MVVM 自动隐藏 WPF 中的 DataGrid 列?

c# - 如何在 DataGridViews 中同步水平滚动

C# - 将 EventArgs 转换为通用事件类型

c++ - 对 C++ 类型转换感到困惑

perl - Perl 的默认对象到字符串转换在哪里定义?

c# - 正则表达式:匹配表达式周围最接近的开闭花括号内的所有内容