这两天有个朋友发来这样一段代码,无法编译通过:

public static IEnumerable<T> Except<T>(this IEnumerable<T> soucrce, T item)  
{
    return soucrce.Where(p=> p!=item);
}

vs会提示:运算符“!=”无法运用于T和T…。首先我们先来查找一下报错的原因:因为T是一个泛型,在编译时无法确定类型,而操作符并“!=”不是所有类型都有的,所以vs提示错误。那么 我们需要怎么改动呢?
###方法一

public static IEnumerable<T> Except<T>(this IEnumerable<T> soucrce, T item) where T : class
{
    return soucrce.Where(p=> p!=item);
}

这个方法告诉编译器,T参数类型是一个class。class 是实现了”!=”操作符的,所以可以成功编译。 ###方法二

public static IEnumerable<T> Except<T>(this IEnumerable<T> soucrce, T item)
{
     return soucrce.Where(p=>!p.Equals(item));
}

使用Equals方法,这个方式时object中的虚方法。C#中所有类都派生自object ,所以编译通过。 当我们是用自定义类型时,需要重写Equals方法来使其生效,否则即使所有属性值相等,也会返回false。