这两天有个朋友发来这样一段代码,无法编译通过:
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。