c#枚举协方差不';行不通

c#枚举协方差不';行不通,c#,enums,covariance,C#,Enums,Covariance,我需要使用枚举作为协变类型。假设我有以下代码: public enum EnumColor { Blue = 0, Red = 1, } public class Car : IColoredObject<EnumColor> { private EnumColor m_Color; public EnumColor Color { get { return m_Color;

我需要使用枚举作为协变类型。假设我有以下代码:

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 + "." );
        }
    }
}
公共枚举枚举颜色
{
蓝色=0,
红色=1,
}
公车:IColoredObject
{
私有颜色m_颜色;
公共颜色
{
得到
{
返回m_颜色;
}
设置
{
m_颜色=值;
}
}
公共汽车
{
}
}
班级计划
{
静态void Main()
{
汽车=新车();
独立类。DoesItWork(car);
}
}
该代码:

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 + "." );
        }
    }
}
公共接口图标对象
{
枚举颜色类型颜色
{
得到;
}
}
公共静态类独立类
{
公共静态车辆(目标车)
{
IColoredObject coloredObject=汽车作为IColoredObject;
if(coloredObject==null)
WriteLine(“它不工作”);
其他的
{
Console.WriteLine(“它可以工作”);
int colorNumber=(int)(coloredObject.Color);
Console.WriteLine(“汽车有颜色编号”+颜色编号+”);
}
}
}
我正在尝试使用Enum

IColoredObject<Enum> coloredObject = car as IColoredObject<Enum>;
IColoredObject coloredObject=car作为IColoredObject;
我试图使用IConvertible,它是枚举的接口

IColoredObject<IConvertible> coloredObject = car as IColoredObject<IConvertible>;
IColoredObject coloredObject=car作为IColoredObject;
但每次它都不起作用(它是空的)

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


(我不想在代码的第二部分中使用EnumColor,因为我希望两个独立的代码仅通过接口连接。)

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

泛型接口中的差异仅支持引用类型。 值类型不支持差异。例如,
IEnumerable
(Visual Basic中的IEnumerable(整数的)不能隐式 转换为
IEnumerable
(对象的)IEnumerable 基本),因为整数由值类型表示


最后,我用泛型方法解决了我的问题。再加上几个字符,它就行了

第一个代码:

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 );
    }
}
公共枚举枚举颜色
{
蓝色=0,
红色=1,
}
公车:IColoredObject
{
私有颜色m_颜色;
公共颜色
{
得到
{
返回m_颜色;
}
设置
{
m_颜色=值;
}
}
公共汽车
{
}
}
班级计划
{
静态void Main()
{
汽车=新车();
独立类。DoesItWork(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 + "." );
        }
    }
}
公共接口图标对象
{
枚举颜色类型颜色
{
得到;
}
}
公共静态类独立类
{
公共静态车辆(目标车)
{
IColoredObject coloredObject=汽车作为IColoredObject;
if(coloredObject==null)
WriteLine(“它不工作”);
其他的
{
Console.WriteLine(“它可以工作”);
int colorNumber=(int)(coloredObject.Color作为对象);
Console.WriteLine(“汽车有颜色编号”+颜色编号+”);
}
}
}

原因是值类型不支持协方差,这是正确的。但是,上面的值类型是
EnumColor
。类
System.Enum
是一个引用类型。在上面的代码中,如果尝试将
icolordObject
转换为例如
icolordObject
,则它将起作用。为此,请定义
类OtherCar:icolordObject
。然后使用名为
otherCar
的实例,代码
icolordObject coloredObject=otherCar作为icolordObject或简单地
icolordObject coloredObject=otherCar将完美地工作。