为什么我的代码会出现这个错误?
不能用作类型参数...没有从OtaqGetAllRq
到OtaqGetAllRq
的隐式引用转换CrudGetAllRequestBase<BaseAxtarishVM>
这是有问题的代码:
public class OtaqGetAllRq : CrudGetAllRequestBase<OtaqAxtarishVM>
{
}
public class CrudGetAllRequestBase<TSearchCriteria> : AxtarishRequestBase<TSearchCriteria>
where TSearchCriteria : BaseAxtarishVM, new()
{
public CrudGetAllRequestBase()
{
}
}
public class AxtarishRequestBase<TSearchCriteria> : RequestBase
where TSearchCriteria : BaseAxtarishVM, new()
{
public AxtarishRequestBase()
{
SearhCriteria = new TSearchCriteria();
}
public TSearchCriteria? SearhCriteria { get; set; }
}
public abstract class RequestBase
{
}
public class BaseAxtarishVM : BaseVM
{
public BaseAxtarishVM()
{
}
public virtual string? ModuleId { get; }
public bool IsActive { get; set; }
}
public abstract class BaseVM : IBaseVM
{
public virtual long Id { get; set; }
}
public abstract class Tbc2DepCrudAsPopupNsBase<THamisiniGetirRq> : TbcCoreDataComponentBase
where THamisiniGetirRq : CrudGetAllRequestBase<BaseAxtarishVM>
{
}
public class OtaqMainBase2 : Tbc2DepCrudAsPopupNsBase<OtaqGetAllRq>
{
public OtaqMainBase2()
{
}
}
原因是
CrudGetAllRequestBase<OtaqAxtarishVM>
和CrudGetAllRequestBase<BaseAxtarishVM>
是两个不同的类,所以它们不能相互转换,虽然OtaqAxtarishVM
是从BaseAxtarishVM
派生的。
类不能协变,但接口和委托可以。你有3个选择:
1。从类中抽象接口
public interface ICrudGetAllRequestBase<out TSearchCriteria>
where TSearchCriteria : BaseAxtarishVM { }
public class CrudGetAllRequestBase<TSearchCriteria> : AxtarishRequestBase<TSearchCriteria>,
ICrudGetAllRequestBase<TSearchCriteria>
where TSearchCriteria : BaseAxtarishVM, new() { }
public abstract class Tbc2DepCrudAsPopupNsBase<THamisiniGetirRq> :
TbcCoreDataComponentBase
where THamisiniGetirRq : ICrudGetAllRequestBase<BaseAxtarishVM> { }
public class OtaqMainBase2 : Tbc2DepCrudAsPopupNsBase<OtaqGetAllRq> { }
2。应用基础非泛型类约束
public abstract class Tbc2DepCrudAsPopupNsBase<THamisiniGetirRq> : TbcCoreDataComponentBase
where THamisiniGetirRq : RequestBase { }
public class OtaqMainBase2 : Tbc2DepCrudAsPopupNsBase<OtaqGetAllRq> { }
3。添加通用参数
public abstract class Tbc2DepCrudAsPopupNsBase<THamisiniGetirRq, TSearchCriteria> : TbcCoreDataComponentBase
where THamisiniGetirRq : CrudGetAllRequestBase<TSearchCriteria>
where TSearchCriteria : BaseAxtarishVM, new() { }
public class OtaqMainBase2 : Tbc2DepCrudAsPopupNsBase<OtaqGetAllRq, OtaqAxtarishVM> { }