我需要使用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,因为我想要两个独立的代码只与接口连接。)
答案 0 :(得分:8)
“值类型”不支持协方差Enum
属于此类别,因此不起作用。
仅针对参考类型支持通用接口的差异。 值类型不支持方差。例如,
IEnumerable<int>
(Visual Basic中的IEnumerable(Of Integer))不能隐式 在Visual中转换为IEnumerable<object>
(IEnumerable(Of Object)) 基本),因为整数由值类型表示。
答案 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 + "." );
}
}
}