有没有办法在C#中隐式构造一个类型?

时间:2012-07-01 00:51:54

标签: c# .net types

我读到了一个有用的技巧,关于如何通过为您正在使用的每种域类型创建数据类型来避免在代码中使用错误的域数据。通过这样做,编译器将防止您意外混合您的类型。

例如,定义这些:

public struct Meter
{
    public int Value;

    public Meter(int value)
    {
        this.Value = value;
    }
}

public struct Second
{
    public int Value;

    public Second(int value)
    {
        this.Value = value;
    }
}

允许我不混淆米和秒,因为它们是单独的数据类型。这很棒,我可以看到它有多么有用。我知道你仍然需要定义运算符重载来处理这些类型的任何算术,但为了简单起见,我将其留下。

我使用这种方法的问题是,为了使用这些类型,我每次都需要使用完整的构造函数,如下所示:

Meter distance = new Meter(5);

C#中是否有任何方法我可以使用System.Int32使用的相同构造模式,如下所示:

Meter distance = 5;

我尝试创建一个隐式转换,但似乎这需要是Int32类型的一部分,而不是我的自定义类型。我无法向Int32添加扩展方法,因为它需要是静态的,所以有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:24)

您可以直接在结构本身中指定implicit conversion

public struct Meter
{
    public int Value;

    public Meter(int value)
    {
        this.Value = value;
    }

    public static implicit operator Meter(int a)
    {
         return new Meter(a);
    }
}

public struct Second
{
    public int Value;

    public Second(int value)
    {
        this.Value = value;
    }

    public static implicit operator Second(int a)
    {
         return new Second(a);
    }
}