什么“where”子句将使这个通用方法工作?

时间:2011-03-05 01:11:40

标签: c# generics

考虑这个公认的通用定义:

    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”条款是什么?

5 个答案:

答案 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