C# 枚举协方差不起作用



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

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<Enum> coloredObject = car as IColoredObject<Enum>;

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

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

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

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

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

"

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

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

源 MSDN

最后,我用通用方法解决了我的问题。它多了几个字符,但它有效。

第一个代码:

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 + "." );
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新