Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型类参数对方法无效?_C#_Linq_Generics - Fatal编程技术网

C# 泛型类参数对方法无效?

C# 泛型类参数对方法无效?,c#,linq,generics,C#,Linq,Generics,我定义了一个泛型类型,如下所示: public class RelevanceGroup<T> { public string Name; public List<Relevance<T>> Relevances { get; set; } = new List<Relevance<T>> { }; public RelevanceGroup(string name) { this.Na

我定义了一个泛型类型,如下所示:

public class RelevanceGroup<T>
{
    public string Name;
    public List<Relevance<T>> Relevances { get; set; } = new List<Relevance<T>> { };

    public RelevanceGroup(string name)
    {
        this.Name = name;

    }
    public RelevanceGroup(List<Relevance<T>> relevances, string name)
    {
        this.Name = name;
        this.Relevances = relevances;
    }

    public bool ChangesHasBeenMade(List<Relevance<T>> newRelevances)
    {
        return !(newRelevances.All(o => this.Relevances.Any(w => w.ItemId == o.ItemId)) && (this.Relevances.All(o => newRelevances.Any(w => w.ItemId == o.ItemId))));
    }
公共类关联组
{
公共字符串名称;
公共列表相关性{get;set;}=新列表{};
公共关联组(字符串名称)
{
this.Name=Name;
}
公共关联组(列表关联、字符串名称)
{
this.Name=Name;
这个。相关性=相关性;
}
公共业务变更(列出新的相关信息)
{
return!(newRelevances.All(o=>this.Relevances.Any(w=>w.ItemId==o.ItemId))&(this.Relevances.All(o=>newRelevances.Any(w=>w.ItemId==o.ItemId));
}
我的问题是关于最后一种方法:

我在linq表达式中收到一条编译错误消息,说“运算符==不能应用于T和T类型的操作数”。我必须执行foreach循环才能使其工作。我可以做些什么使该方法与linq表达式一起工作吗


提前感谢。

如果
T
始终是引用类型,您可以为它添加一个约束,它将允许您与
=
进行比较

public class RelevanceGroup<T> where T:class
公共类关联组,其中T:class

在方法内部,编译器不(也不能)知道t是具有默认==运算符的类型还是重载的类型。 您可以使用Equals()方法代替==,如下所示:

    return !(newRelevances.All(o => this.Relevances.Any(w => w.ItemId.Equals( o.ItemId))) && (this.Relevances.All(o => newRelevances.Any(w => w.ItemId.Equals( o.ItemId)))));

尝试
w.ItemId.Equals(o.ItemId)
谢谢oerkelens,但是调用Equals方法是否会导致装箱/取消装箱?如果您担心这样的性能问题,您应该考虑限制您的
T
引用Irwinegarten建议的类型。只有当它成为问题时才需要担心(或者如果你有充分的理由怀疑它可能会成为一个问题),但是!如果是的话(如果你有大量的列表,它可能会成为一个问题),您可能需要重新考虑跟踪更改的策略。T是字符串或Int32
int
struct
,则您不能有此约束。请按照其他人的建议使用
Equals
。谢谢您的帮助。