用户定义的显式和隐式转换运算符
用户定义类型可以定义从或到另一个类型的自定义隐式或显式转换。 隐式转换无需调用特殊语法,并且可以在各种情况(例如,在赋值和方法调用中)下发生。 预定义的 C# 隐式转换始终成功,且永远不会引发异常。 用户定义隐式转换也应如此。 如果自定义转换可能会引发异常或丢失信息,请将其定义为显式转换。
is 和 as 运算符不考虑使用用户定义转换。 强制转换表达式用于调用用户定义显式转换。
operator
和 implicit
或 explicit
关键字分别用于定义隐式转换或显式转换。 定义转换的类型必须是该转换的源类型或目标类型。 可用两种类型中的任何一种类型来定义两种用户定义类型之间的转换。
下面的示例展示如何定义隐式转换和显式转换:
using System;
public readonly struct Digit
{
private readonly byte digit;
public Digit(byte digit)
{
if (digit > 9)
{
throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");
}
this.digit = digit;
}
public static implicit operator byte(Digit d) => d.digit;
public static explicit operator Digit(byte b) => new Digit(b);
public override string ToString() => $"{digit}";
}
public static class UserDefinedConversions
{
public static void Main()
{
var d = new Digit(7);
byte number = d;
Console.WriteLine(number); // output: 7
Digit digit = (Digit)number;
Console.WriteLine(digit); // output: 7
}
}
从 C# 11 开始,可以定义 checked 显式转换运算符。 有关详细信息,请参阅算术运算符一文的用户定义的 checked 运算符部分。
operator
关键字也可用于重载预定义的 C# 运算符。 有关详细信息,请参阅运算符重载。
C# 语言规范
有关更多信息,请参阅 C# 语言规范的以下部分:
另请参阅
- C# 运算符和表达式
- 运算符重载
- 类型测试和强制转换运算符
- 强制转换和类型转换
- 设计准则 - 转换运算符
- Chained user-defined explicit conversions in C#(C# 中链接在一起的用户定义的显式转换)