gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:31:29 25 4
gpt4 key购买 nike

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

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

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

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
}
}

我得到 CS0029 编译错误,说

Cannot implicitly convert type 'System.Linq.Expressions.Expression<System.Func<ConsoleApplication1.IntEntity,int>>' to 'System.Linq.Expressions.Expression<System.Func<ConsoleApplication1.Entity<int>,int>>'

我能做些什么吗?

最佳答案

这本质上是不安全的。

如果这是合法的,您将能够传递一个不同的类继承 Entity<int>你的函数只能接受 IntEntity

相反,您可以使用 CRTP :

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

关于c# - 如何使派生的具体类隐式转换为通用基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20137010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com