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

Я пытался использовать перечисление.

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

Я пытался использовать IConvertible, который является интерфейсом перечисления.

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

но каждый раз это не работает (это было null).

что я должен использовать ? Или как я могу это сделать ?

(Я не хочу использовать EnumColor во второй части кода, потому что я хочу два независимых коды соединяются только с интерфейсом.)

2 ответов


ковариация не поддерживается с "типами значений"Enum попадает под эту категорию и, следовательно, не работает.

дисперсия в универсальных интерфейсах поддерживается только для ссылочных типов. Типы значений не поддерживают дисперсию. Например, IEnumerable<int> (IEnumerable (of Integer) в Visual Basic) не может быть неявно преобразовано в IEnumerable<object> (IEnumerable (объекта) в Visual Basic), поскольку целые числа представлены значением тип.

источник-узел 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 + "." );
        }
    }
}