C#协方差:具有不同接口特征的类
我有一个具有以下签名的基类:C#协方差:具有不同接口特征的类,c#,generics,inheritance,implicit-conversion,C#,Generics,Inheritance,Implicit Conversion,我有一个具有以下签名的基类: abstract class BaseClass<I, S> 因此,ExtendedClass使用int参数设置S基类的泛型类型。我使用的类如下所示: BaseClass<I, S> anInstance = new ExtendedClass<I>(); BaseClass anInstance=new ExtendedClass(); 这会引发以下错误: 无法将类型ExtendedClass隐式转换为基类 一些简化的上下
abstract class BaseClass<I, S>
因此,ExtendedClass
使用int
参数设置S
基类的泛型类型。我使用的类如下所示:
BaseClass<I, S> anInstance = new ExtendedClass<I>();
BaseClass anInstance=new ExtendedClass();
这会引发以下错误:
无法将类型ExtendedClass隐式转换为基类
一些简化的上下文:
abstract class Analyzer<I, S>
{
protected BaseClass<I, S> Run()
{
// implements some logic here, based their results different
// extensions of BaseClass can be returned. This logic is
// simplified as the following.
switch(some_logic_output)
{
case true: return new ExtendedClass<I>(){ /*some property settings*/ };
case false: return null;
}
}
}
抽象类分析器
{
受保护的基类运行()
{
//根据不同的结果,在这里实现一些逻辑
//可以返回基类的扩展。此逻辑为
//简化如下。
开关(一些逻辑输出)
{
case true:返回新的ExtendedClass(){/*一些属性设置*/};
caseflse:返回null;
}
}
}
第二个类型参数必须设置为int
:
BaseClass<I, int> anInstance = new ExtendedClass<I>();
BaseClass anInstance=new ExtendedClass();
显然,
I
也必须是泛型类中的具体类型或其他类型参数。您应该为引用指定S
和I
是什么。如果您不在课程范围内:
BaseClass<SomeClass, int> anInstance = new ExtendedClass<SomeClass>();
BaseClass anInstance=new ExtendedClass();
如果您在课程范围内
BaseClass<I, int> anInstance = new ExtendedClass<I>();
BaseClass anInstance=new ExtendedClass();
S
是在基类的上下文中为泛型类型指定的名称。它不存在于它之外,当定义引用时,你必须给出具体类型。请显示错误行出现的上下文。第三个代码段中的I
和S
是什么?请发布一条。I
和S
由实现这些代码的库的用户提供功能。所以,在编译时,它们只是I
和S
。扩展类在向方法或属性提供值时总是期望int,而基类不会设置该约束(不太具体)。如果您只输出值,则可以使基类使用抽象类基类
来表示逆变。请检查我在更新的问题中提供的简化上下文;您认为泛型类型S
可以在那里设置,而函数Run
可以返回基类的各种扩展,每个扩展都有S
类型的不同参数。
BaseClass<I, int> anInstance = new ExtendedClass<I>();