c#enum协方差不起作用

时间:2014-01-18 10:08:33

标签: c# enums covariance

我需要使用enum作为协变类型。假设我有这段代码:

public enum EnumColor
{
    Blue = 0,
    Red = 1,
}

public class Car : IColoredObject<EnumColor>
{
    private EnumColor m_Color;
    public EnumColor Color
    {
        get
        {
            return m_Color;
        }
        set
        {
            m_Color = value;
        }
    }

    public Car()
    {
    }
}

class Program
{
    static void Main()
    {
        Car car = new Car();
        IndependentClass.DoesItWork( car );
    }
}

和这段代码:

public interface IColoredObject<out EnumColorType>
{
    EnumColorType Color
    {
        get;
    }
}

public static class IndependentClass
{
    public static void DoesItWork( object car )
    {
        IColoredObject<object> coloredObject = car as IColoredObject<object>;

        if( coloredObject == null )
            Console.WriteLine( "It doesn't work." );
        else
        {
            Console.WriteLine( "It works." );

            int colorNumber = (int)( coloredObject.Color );

            Console.WriteLine( "Car has got color number " + colorNumber + "." );
        }
    }
}

我试图使用Enum。

IColoredObject<Enum> coloredObject = car as IColoredObject<Enum>;

我试图使用IConvertible,它是Enum的接口。

IColoredObject<IConvertible> coloredObject = car as IColoredObject<IConvertible>;

但每次它都不起作用(它为空)。

我应该用什么?或者我该怎么做?

(我不想在代码的第二部分使用EnumColor,因为我想要两个独立的代码只与接口连接。)

2 个答案:

答案 0 :(得分:8)

“值类型”不支持协方差Enum属于此类别,因此不起作用。

  

仅针对参考类型支持通用接口的差异。   值类型不支持方差。例如,IEnumerable<int>   (Visual Basic中的IEnumerable(Of Integer))不能隐式   在Visual中转换为IEnumerable<object>(IEnumerable(Of Object))   基本),因为整数由值类型表示。

Source MSDN

答案 1 :(得分:0)

最后我用泛型方法解决了我的问题。这几个字符更多,但它的工作原理。

第一个代码:

public enum EnumColor
{
    Blue = 0,
    Red = 1,
}

public class Car : IColoredObject<EnumColor>
{
    private EnumColor m_Color;
    public EnumColor Color
    {
        get
        {
            return m_Color;
        }
        set
        {
            m_Color = value;
        }
    }

    public Car()
    {
    }
}

class Program
{
    static void Main()
    {
        Car car = new Car();
        IndependentClass.DoesItWork<EnumColor>( car );
    }
}

第二段代码:

public interface IColoredObject<EnumColorType>
{
    EnumColorType Color
    {
        get;
    }
}

public static class IndependentClass
{
    public static void DoesItWork<EnumColorType>( object car )
    {
        IColoredObject<EnumColorType> coloredObject = car as IColoredObject<EnumColorType>;

        if( coloredObject == null )
            Console.WriteLine( "It doesn't work." );
        else
        {
            Console.WriteLine( "It works." );

            int colorNumber = (int)( coloredObject.Color as object );

            Console.WriteLine( "Car has got color number " + colorNumber + "." );
        }
    }
}