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), поскольку целые числа представлены значением тип.
наконец, я решил свою проблему с общим методом. Это несколько символов больше, но это работает.
первый код:
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 + "." );
}
}
}