c#之用户定义的数据类型转换介绍


在C#中,用户定义的数据类型转换通常涉及到自定义类型的转换,这可以通过显式转换(需要程序员明确指定)或隐式转换(由编译器自动处理)来实现,但通常自定义类型之间的转换需要程序员显式定义。这通常通过定义`op_Explicit`(显式转换)和`op_Implicit`(隐式转换)操作符来完成。不过,请注意,在C#中更常见的做法是使用转换方法(如`ToType`方法)或构造函数来执行类型之间的转换,因为这些方法更灵活,也更易于理解和维护。

这里,我将展示如何使用显式转换操作符`op_Explicit`来定义自定义类型之间的转换。


public class Temperature
{
    private double celsius;

    public Temperature(double celsius)
    {
        this.celsius = celsius;
    }

    // 显式转换操作符,从Temperature转换到double(假设转换为摄氏度)
    public static explicit operator double(Temperature temp)
    {
        return temp.celsius;
    }

    // 如果需要,可以定义从其他类型到Temperature的转换
    // 例如,从华氏度转换到Temperature
    public static explicit operator Temperature(double fahrenheit)
    {
        double celsius = (fahrenheit - 32) * 5 / 9;
        return new Temperature(celsius);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Temperature temp = new Temperature(37.5); // 摄氏度

        // 使用显式转换将Temperature转换为double
        double celsius = (double)temp;
        Console.WriteLine($"Celsius: {celsius}");

        // 使用显式转换从华氏度到Temperature
        Temperature tempFromFahrenheit = (Temperature)99.5; // 华氏度
        Console.WriteLine($"Converted from Fahrenheit: {tempFromFahrenheit.celsius} Celsius");
    }
}

在这个例子中,`Temperature`类定义了一个私有字段`celsius`来存储温度值,并提供了从`Temperature`到`double`(摄氏度)的显式转换操作符。此外,还展示了如何从`double`(表示华氏度)到`Temperature`的显式转换,这通过重载`op_Explicit`操作符来实现,尽管在实际应用中,从基本类型到复杂类型(如自定义类型)的转换可能更常见于构造函数或工厂方法中。

请注意,虽然这里使用了`op_Explicit`来展示显式转换,但C#中更常见的做法是使用转换方法(如`ToCelsius()`)来执行此类转换,因为这更符合C#的惯用模式,并且使代码更加清晰和易于维护。