【发布时间】:2020-10-16 04:29:00
【问题描述】:
假设我有这个类和方法,Store.Users 的上下文。 Get 的类型为 User。但是,当我将方法参数设置为Expression<Func<T,bool>> 并将其作为Get() 方法的表达式传递时。我收到一个 IDE & build 错误说明:
Argument 1 : cannot convert from Expression<Func<T,bool>> to Expression<Func<User,bool>>.
'Argument Type: Expression<Func<T,bool>> is not assignable to parameter type Expression<Func<User,bool>>'.
除了本例之外,代码的所有其他部分都能够识别出T 的类型为User。任何提示/想法都会很棒。
public class Builder<T> : DataBuilder<T> where T : User
{
public override T Exists(Expression<Func<T, bool>> predicateExpression)
{
return Store.Users.Get(predicateExpression).FirstOrDefault();
}
}
【问题讨论】:
-
Store.Users.Get 的类型是严格的,即它需要是用户。使用您拥有的代码,它可以是其他东西,因此编译器不会允许它。泛型 where 约束告诉编译器它可以是 User 或继承自 User 的类。假设您创建了从 User 继承的 SuperUser,您将无法使用 Expression
> 调用 Store.Users.Get。不过,你所做的很有趣。祝你好运! -
为什么
Builder是通用的?为什么没有class Builder : DataBuilder<User>? -
您可以实现更通用的访问,而不是调用 Store.Users.Get,例如在 context.Set
().Get() 上?
标签: c# linq generics type-conversion