简单的泛型类型比较

时间:2017-03-27 11:12:16

标签: c# .net generics

我有一个带有通用标识符类型的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的签名更改为以下内容时,我无法将简单类型定义为intstring再等TUserIdentifier

public class UserManager<TUser, TUserIdentifier>
    where TUser : MyUser<TUserIdentifier>
    where TUserIdentifier : class

解决方法是使用IntegerString等类。

我尝试做的另一件事是以下签名,但它不起作用

public class UserManager<TUser, TUserIdentifier>
    where TUser : MyUser<TUserIdentifier>
    where TUserIdentifier : IComparable

我应该选择IntegerString等课程还是其他方式?

1 个答案:

答案 0 :(得分:4)

这里的问题是编译器无法确定您是否错误地在两个值类型之间执行引用相等性检查; ReferenceEquals(1, 1) 始终false,参考相等对值类型没有意义!

因为您的泛型类型不限于引用类型(class约束),编译器只是不允许==运算符,因为它的默认实现恰好是引用相等。

要避免此问题,只需使用虚拟Equals方法。