C# 实例化通用接口
我有两个接口:C# 实例化通用接口,c#,generics,C#,Generics,我有两个接口: public interface IReportRow { List<string> ToList(); } public interface IReportPreparer<T> where T : IReportRow { List<T> GetRows(JObject json); string GetAdditionalData(T reportRow); } 以及一个实现IReportPrepare
public interface IReportRow
{
List<string> ToList();
}
public interface IReportPreparer<T>
where T : IReportRow
{
List<T> GetRows(JObject json);
string GetAdditionalData(T reportRow);
}
以及一个实现IReportPreparer
接口的类:
public class SellingReportRow : IReportRow
{
...interface implementation
}
public class SellingReportPreparer :
IReportPreparer<SellingReportRow>
{
...interface implementation
}
public class SellingReportPreparer:
I报告准备人
{
…接口实现
}
现在,当我尝试创建SellingReportPreparer类的实例时,如下所示:
IReportPreparer<IReportRow> preparer = new SellingReportPreparer()
IReportPreparer<IReportRow> preparer = (IReportPreparer<IReportRow>)(new SellingReportPreparer());
IReportPreparer preparer=新的SellingReportPreparer()
Intellisense告诉我需要从SellingReportPreparer到IReportPreparer
的显式转换
当我像这样显式转换时:
IReportPreparer<IReportRow> preparer = new SellingReportPreparer()
IReportPreparer<IReportRow> preparer = (IReportPreparer<IReportRow>)(new SellingReportPreparer());
IReportPreparer preparer=(IReportPreparer)(new SellingReportPreparer());
我遇到一个异常-无法将类型为VSKCasco.ReportPrepare.SellingReportPreparer的对象强制转换为类型为VSKCasco.ReportPrepare.IReportPreparer1[VSKCasco.ReportPrepare.IReportRow]
我需要
IReportPreparer
接口是泛型的,这样它的两种方法都可以使用相同的IReportRow
实现类型。我应该如何制作一个销售报告编制者的实例 您需要使IReportPreparer
将其通用参数指定为out
public interface IReportPreparer<out T>
where T : IReportRow
{
//List<T> GetRows(JObject json);
//string GetAdditionalData(T reportRow);
}
注意这次GetAdditionalData
仍然被注释掉-同样的问题,没有解决方案 输入的类型
public class SellingReportPreparer :
IReportPreparer<**SellingReportRow**>
{
...interface implementation
}
public class SellingReportPreparer:
I报告准备人
{
…接口实现
}
需要像这样的报告
public class SellingReportPreparer :
IReportPreparer<IReportRow>
{
...interface implementation
}
public class SellingReportPreparer:
I报告准备人
{
…接口实现
}
为什么第一个没有编译:
您告诉SellingReportPreparer实现支持SellingReportRow类型的IReportPreparer。但是,IReportPreparer不支持SellingReportRow,它只知道IReportRow,不需要知道更多。它会编译吗?@Jamiec-如果您在注释中包含行-yes@GiladGreen啊,你说得对。我没怎么注意,但列表不能是协变的。很好。@Jamiec-很好:)这不仅仅是
List
的问题,也是string GetAdditionalData(T reportRow)的问题代码>不是吗?请解释下一票,因为这是有效的。我复制了所有的OPs代码并进行了修改,所有的工作都表明“类型需要是IReportRow”与所问的问题完全相反。OP询问协方差(即使他们不知道协方差的单词!)@Jamiec“我需要IReportPreparer接口是泛型的,这样它的两种方法都可以使用相同的IReportRow实现类型。”。这个答案与此并不矛盾。这不是返回类型,他告诉SellingReportPreparer实现IReportPreparer,而IReportPreparer没有exist@MartinGrégoire说我有两个IReportRow的实现——类ReportRowA:IReportRow和类ReportRowB:IReportRow。若我使用您的解决方案,那个么我可以实现SellingReportPreparer,这样GetRows将返回List,GetAdditionalData将接受ReportRowB作为参数。我需要一些限制,以便这两种方法只能在相同的实现中工作。