C# 简单泛型类型比较
我有一个带有泛型标识符类型的C# 简单泛型类型比较,c#,.net,generics,C#,.net,Generics,我有一个带有泛型标识符类型的MyUser类。UserManager类有一个方法GetByIdentifier,该方法将给定标识符与已知用户标识符进行比较。问题是我得到了以下错误: 运算符“==”不能应用于“TUserIdentifier”和“TUserIdentifier”类型的操作数 解决方法是使用整数、字符串等类 我试着做的另一件事是下面的签名,但它不起作用 public class UserManager<TUser, TUserIdentifier> where T
MyUser
类。UserManager
类有一个方法GetByIdentifier
,该方法将给定标识符与已知用户标识符进行比较。问题是我得到了以下错误:
运算符“==”不能应用于“TUserIdentifier”和“TUserIdentifier”类型的操作数
解决方法是使用整数
、字符串
等类
我试着做的另一件事是下面的签名,但它不起作用
public class UserManager<TUser, TUserIdentifier>
where TUser : MyUser<TUserIdentifier>
where TUserIdentifier : IComparable
公共类用户管理器
其中TUser:MyUser
where TUserIdentifier:i可比较
我应该使用
整数
、字符串
等类还是有其他方法?这里的问题是编译器无法确保您没有错误地在两个值类型之间执行引用相等检查ReferenceEquals(1,1)
将始终为false
,引用相等对值类型没有意义
由于泛型类型不受引用类型的约束(class
constraint),编译器只允许使用=
运算符,因为它的默认实现正是引用相等
为了避免这个问题,只需使用virtual
Equals
方法。@CodeCaster据我所知,这篇文章基本上是说,我必须使用引用类型,让编译器知道类型可以比较(可以应用运算符)。因此,我必须使用int、string等的引用类型实现。对吗?进一步,您可以使用where-TUserIdentifier:object。@Dr.Fre:投票率最高的答案(不是被接受的答案)说你可以这样做:EqualityComparer.Default.Equals(x,y)
,这似乎是最好的方法。啊,我必须一直读到这些帖子的最后,而不是仅仅提出一个新问题。谢谢谢谢这正是我要找的for@Dr.Fre如果可能的话,请考虑将代码< > TUSERistIVER < /C> > <代码> IEQuabtI>代码>以避免不必要的装箱。
public class UserManager<TUser, TUserIdentifier>
where TUser : MyUser<TUserIdentifier>
where TUserIdentifier : class
public class UserManager<TUser, TUserIdentifier>
where TUser : MyUser<TUserIdentifier>
where TUserIdentifier : IComparable