考虑这个公认的通用定义:
private void Foo<T,BASETYPE>(PropertyInfo prop, BASETYPE o1, BASETYPE o2)
{
T value1 = (T) prop.GetValue(o1, null);
T value2 = (T) prop.GetValue(o2, null);
if (value1 != value2)
Console.WriteLine("NOT EQUAL");
}
prop保证是BASETYPE的PropertyInfo。
我在if()语句中遇到编译错误:
Operator '!=' cannot be applied to operands of type 'T' and 'T'
虽然在“一般情况下”我理解错误消息是有效的,在这种情况下,我只想要一些标准类型的例程:System.Int64,System.String等所有支持= =和!=运算符。
我认为这可以通过“where”子句修复,但IComparable和IEqualable没有帮助。
有谁知道正确的“where”条款是什么?
谢
答案 0 :(得分:4)
由于您的列表实现IComparable
中的System.Int64,System.String等..您可以使用
where T : IComparable
并使用CompareTo()
代替!=
例如。这段代码会编译
private void Foo<T>(object o) where T : IComparable
{
T v1 = default(T);
T v2 = default(T);
if(v1.CompareTo(v2) != 0)
{
Console.WriteLine("Not Equal");
}
}
private void Bar()
{
Foo<string>(new object());
}
答案 1 :(得分:0)
.Equals()
。
答案 2 :(得分:0)
您可以使用所有类型的Equals()
实例方法,静态Object.ReferenceEquals()
或Object.Equals()
方法,也可以使用EqualityComparer<T>.Default.Equals()
方法。
答案 3 :(得分:0)
如果您愿意接受性能影响,可以使用
if (Comparer<T>.Default.Compare(value1, value2) == 0))
{
Console.WriteLine("NOT EQUAL");
}
答案 4 :(得分:0)
我认为你不能。没有运算符约束这样的东西,所以没有办法告诉编译器它应该只允许调用带有!=运算符的对象。您可以使用.Equals方法,因为它位于基础对象类中。
这是一篇讨论运算符约束的文章: Operator Constraints