C#与泛型的隐式转换混淆

问题描述 投票:0回答:1

为什么我的代码会出现这个错误?

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()
    {
    }
}
c# generics implicit-conversion
1个回答
0
投票

原因是

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> { }
© www.soinside.com 2019 - 2024. All rights reserved.