我正在寻找检查泛型类中的枚举集的值。当我尝试编写基本的if语句if (item.Value == AlphaType.A1)
时,出现以下错误:
运算符'=='不能应用于类型'T'和'Program.AlphaType'的操作数
代码如下:
public enum AlphaType
{
A1,
A2
}
public enum BetaType
{
B1,
B2
}
public class Item<T>
{
public T Value { get; set; }
public string Foo { get; set;}
}
public static void Main()
{
var item1 = new Item<AlphaType> { Value = AlphaType.A1, Foo = "example 1" };
var item2 = new Item<BetaType> { Value = BetaType.B1, Foo = "example 2" };
PrintAlphaFoo(item1);
PrintAlphaFoo(item2);
}
public static void PrintAlphaFoo<T>(Item<T> item)
{
if (item.Value == AlphaType.A1)
{
Console.WriteLine(item.Foo);
}
}
此处代码应输出示例1 ,而不是示例2 。
答案 0 :(得分:2)
由于类型不匹配,无法使用运算符。编译器无法知道T是您的枚举。您可以通过将值强制转换为对象然后再次强制转换为类型来修复它:
if ((AlphaType)(object)item.Value == AlphaType.A1)
或者我们甚至可以让Equals等于我们的演员并写:
if (item.Value.Equals(AlphaType.A1))
但是你不能在这里停下来。您的错误已修复,但不是主要问题。只有这样,示例2 才会被打印出来。您必须先进行另一项检查:
if (item.Value.GetType() == typeof(AlphaType) && (AlphaType)(object)item.Value == AlphaType.A1)
完整代码:
public enum AlphaType
{
A1,
A2
}
public enum BetaType
{
B1,
B2
}
public class Item<T>
{
public T Value { get; set; }
public string Foo { get; set;}
}
public static void Main()
{
var item1 = new Item<AlphaType> { Value = AlphaType.A1, Foo = "example 1" };
var item2 = new Item<BetaType> { Value = BetaType.B1, Foo = "example 2" };
PrintAlphaFoo(item1);
PrintAlphaFoo(item2);
}
public static void PrintAlphaFoo<T>(Item<T> item)
{
if (item.Value.GetType() == typeof(AlphaType) && item.Value.Equals(AlphaType.A1))
{
Console.WriteLine(item.Foo);
}
}
来源:
答案 1 :(得分:0)
您还可以尝试使用Enum.TryParse()
这样的方法
public static void PrintAlphaFoo<T>(Item<T> item)
{
AlphaType alphaType;
if (!Enum.TryParse<AlphaType>(item.Value.ToString(), out alphaType))
{
return;
}
if (alphaType == AlphaType.A1)
{
Console.WriteLine(item.Foo);
}
}