我有一个带有通用标识符类型的MyUser
类。 UserManager
类有一个方法GetByIdentifier
,它将给定的标识符与已知的用户标识符进行比较。问题是我收到以下错误:
运算符'=='无法应用于'TUserIdentifier'和'TUserIdentifier'类型的操作数
public MyUser<TIdentifier>
{
public TIdentifier Identifier { get; set; }
}
public class UserManager<TUser, TUserIdentifier>
where TUser : MyUser<TUserIdentifier>
{
protected List<TUser> userStore = new List<TUser>();
protected TUser GetByIdentifier(TUserIdentifier identifier)
{
return userStore.FirstOrDefault(c => c?.Identifier == identifier);
}
}
当我将UserManager
的签名更改为以下内容时,我无法将简单类型定义为int
,string
再等TUserIdentifier
。
public class UserManager<TUser, TUserIdentifier>
where TUser : MyUser<TUserIdentifier>
where TUserIdentifier : class
解决方法是使用Integer
,String
等类。
我尝试做的另一件事是以下签名,但它不起作用
public class UserManager<TUser, TUserIdentifier>
where TUser : MyUser<TUserIdentifier>
where TUserIdentifier : IComparable
我应该选择Integer
,String
等课程还是其他方式?
答案 0 :(得分:4)
这里的问题是编译器无法确定您是否错误地在两个值类型之间执行引用相等性检查; ReferenceEquals(1, 1)
始终为false
,参考相等对值类型没有意义!
因为您的泛型类型不限于引用类型(class
约束),编译器只是不允许==
运算符,因为它的默认实现恰好是引用相等。
要避免此问题,只需使用虚拟Equals
方法。