我可以声明自定义类型(枚举除外)的编译时常量吗?

时间:2012-10-01 11:01:00

标签: c# immutability

考虑这种类型,它是不可变的,我可以做到吗?

public struct SomeType
{
    public const int OneValue = 1;

    private static readonly one = new SomeType(one);

    private readonly int value;

    private SomeType(int value)
    {
        this.value = value;
    }

    public static One
    {
        get { return this.one; }
    }

    public static implicit operator int(SomeType source)
    {
        return source.value;
    }

    public void SomeSpecialization()
    {
    }
}

这允许我这样做,

var one = SomeType.One;

switch (one)
{
    case SomeType.OneValue:
        ...
}

但是,无论如何我可以删除

public static implicit operator int(SomeType source)
    {
        return source.value;
    }
从类型定义

并使用这样的类型?

var one = SomeType.One;

switch (one)
{
    case SomeType.One:
        ...
}

3 个答案:

答案 0 :(得分:2)

case语句中的switch表达式只能是某些内置类型和enum的编译时常量。所以答案是否定的:无论你对SomeType做什么(没有把它变成enum),你都不能将SomeType个对象用作case个表达式。< / p>

答案 1 :(得分:1)

如果您不使用Enum,请尝试使用静态类:

public static class SomeType
{
    public const int OneValue = 1;
    public const int SecondValue = 2;
}

答案 2 :(得分:0)

这有什么帮助吗?

public struct SomeType<T> where T : IConvertible
{
    private static readonly T _one = (T)Convert.ChangeType(1, typeof(T));
    public static T One { get { return _one; } }
}