我有两个界面:
public interface IReportRow
{
List<string> ToList();
}
public interface IReportPreparer<T>
where T : IReportRow
{
List<T> GetRows(JObject json);
string GetAdditionalData(T reportRow);
}
实现IReportRow
接口的类:
public class SellingReportRow : IReportRow
{
...interface implementation
}
以及实现IReportPreparer
接口的类:
public class SellingReportPreparer :
IReportPreparer<SellingReportRow>
{
...interface implementation
}
现在,当我尝试像这样创建一个SellingReportPreparer类的实例时:
IReportPreparer<IReportRow> preparer = new SellingReportPreparer()
Intellisense告诉我,我需要从SellingReportPreparer to IReportPreparer< IReportRow >
进行显式转换。
当我明确转换时:
IReportPreparer<IReportRow> preparer = (IReportPreparer<IReportRow>)(new SellingReportPreparer());
我收到例外情况 - Unable to cast object of type VSKCasco.ReportPrepare.SellingReportPreparer to type VSKCasco.ReportPrepare.IReportPreparer1[VSKCasco.ReportPrepare.IReportRow]
我需要IReportPreparer
接口是通用的,因此它的两个方法都可以使用相同的IReportRow
实现类型。我该如何制作SellingReportPreparer
的实例?
答案 0 :(得分:0)
您需要IReportPreparer
将其通用参数指定为out
public interface IReportPreparer<out T>
where T : IReportRow
{
//List<T> GetRows(JObject json);
//string GetAdditionalData(T reportRow);
}
然后这行将编译
IReportPreparer<IReportRow> preparer = new SellingReportPreparer();
然而,(H / T @GiladGreen),您注意到我已经注释掉了列表中使用T
的行 - 因为列表不能协变。如果你可以逃脱IEnumerable<T>
那么它就可以了。
public interface IReportPreparer<out T>
where T : IReportRow
{
IEnumerable<T> GetRows(JObject json);
//string GetAdditionalData(T reportRow);
}
请注意,此时GetAdditionalData
仍被注释掉 - 同样的问题,没有解决方案!
答案 1 :(得分:0)
中的类型
public class SellingReportPreparer :
IReportPreparer<**SellingReportRow**>
{
...interface implementation
}
需要像这样的IReportRow
public class SellingReportPreparer :
IReportPreparer<IReportRow>
{
...interface implementation
}
为什么第一个不编译:
您告诉SellingReportPreparer实现支持SellingReportRow类型的IReportPreparer。但是,IReportPreparer不支持SellingReportRow,它只知道IReportRow,它不需要知道更多。