C#Moq - 无法将List <derivedclass>转换为List <baseclass>

时间:2018-03-15 22:22:06

标签: c# inheritance moq

在我的单元测试中,我试图设置一个方法来返回List,当实际方法期望返回类型给我一个List。但是我收到了这个错误:

Argument 1: cannot convert from 'System.Collections.Generic.List<FSVendorRepository.AccountingManagement.Models.StatementDetail.RegionalStatementDetailItem>' to 'System.Collections.Generic.List<FSVendorRepository.AccountingManagement.Models.StatementDetail.Base.StatementDetail>'

这告诉我我无法模拟我的函数来返回List。

以下是代码:

基类:

namespace FSVendorRepository.AccountingManagement.Models.StatementDetail.Base {
    public abstract class StatementDetail {
              //Props
    }
}

派生类:

namespace FSVendorRepository.AccountingManagement.Models.StatementDetail {
    public class RegionalStatementDetailItem : Base.StatementDetail {
              //Props
    }
}

接口:

namespace FSVendorRepository.AccountingManagement {
    public interface IAccountingManager {
        List<StatementDetail> ReturnDerivedListTest();
        StatementDetail ReturnDerivedClassTest();

    }
}

单元测试:

 public async Task ReturnStatementDetails_UserIsMasterSubRepAndIsExporting_CorrectRegionalStatementDetailsClassReturned() {
            var regionalItem = new RegionalStatementDetailItem();
            var liRegionalItems = new List<RegionalStatementDetailItem>();

            _iMockAccountingManager.Setup(x => x.ReturnDerivedListTest()).Returns(liRegionalItems); //compile time exception
            _iMockAccountingManager.Setup(x => x.ReturnDerivedClassTest()).Returns(regionalItem); //passes
}

当我创建一个返回基类的单个实例并用派生类替换它的方法并且它起作用时,我倍感困惑。

为什么不认为有效?

1 个答案:

答案 0 :(得分:2)

因为List<DerivedClass>不是从List<BaseClass>派生的,而且从这个角度来看,T内部所做的事实是无关紧要的。

您正在寻找的是协方差。这里有关于它的MSDN文档:https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance