Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实例化通用接口_C#_Generics - Fatal编程技术网

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作为参数。我需要一些限制,以便这两种方法只能在相同的实现中工作。