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>();