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