如何使派生的具体类隐式地转换为通用基类?

hor*_*rgh 3 c# generics

我有一个基本的抽象泛型类,它可以通过表达式获取对象的标识符:

public abstract class Entity<TId> where TId : IEquatable<TId>
{
    protected abstract Expression<Func<Entity<TId>, TId>> GetEntityId();
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试从中派生(并实现抽象方法)时:

public class IntEntity : Entity<int>
{
    public int Id { get; set; }

    protected override Expression<Func<Entity<int>, int>> GetEntityId()
    {
        Expression<Func<IntEntity, int>> exp = e => e.Id;
        return exp; // CS0029 error
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到CS0029编译错误,说

无法隐式将类型' System.Linq.Expressions.Expression<System.Func<ConsoleApplication1.IntEntity,int>>' 转换为' System.Linq.Expressions.Expression<System.Func<ConsoleApplication1.Entity<int>,int>>'

我能做些什么吗?

SLa*_*aks 6

这本质上是不安全的.

如果这是合法的,你将能够传递一个继承Entity<int>到你的函数只能接受IntEntitys 的另一个类.

相反,您可以使用CRTP:

public abstract class Entity<TEntity, TId> 
    where TId : IEquatable<TId> 
    where TEntity : Entity<TEntity, TId>
{
    protected abstract Expression<Func<TEntity, TId>> GetEntityId();
}
Run Code Online (Sandbox Code Playgroud)