C# 协方差:类 具有不同的接口签名
C# covariance: classes with different interface signature
我有一个具有以下签名的基础 class:
abstract class BaseClass<I, S>
然后我用下面的签名定义一个 class 来扩展 BaseClass
:
class ExtendedClass<I> : BaseClass<I, int>
因此,ExtendedClass
使用 int
参数设置 BaseClass
的 S
通用类型。我正在使用 classes,如下所示:
BaseClass<I, S> anInstance = new ExtendedClass<I>();
这会引发以下错误:
Cannot implicitly convert type ExtendedClass to BaseClass
一些简化的上下文:
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;
}
}
}
第二类参数必须设置为int
:
BaseClass<I, int> anInstance = new ExtendedClass<I>();
显然,I
也必须是具体类型或泛型中的其他类型参数 class。
你应该指定参考S
和I
是什么。如果你在class范围之外:
BaseClass<SomeClass, int> anInstance = new ExtendedClass<SomeClass>();
如果您在class
的范围内
BaseClass<I, int> anInstance = new ExtendedClass<I>();
S
是在 BaseClass
上下文中为泛型类型指定的名称。它不存在于它之外,并且在像您一样定义引用时必须提供具体类型。
我有一个具有以下签名的基础 class:
abstract class BaseClass<I, S>
然后我用下面的签名定义一个 class 来扩展 BaseClass
:
class ExtendedClass<I> : BaseClass<I, int>
因此,ExtendedClass
使用 int
参数设置 BaseClass
的 S
通用类型。我正在使用 classes,如下所示:
BaseClass<I, S> anInstance = new ExtendedClass<I>();
这会引发以下错误:
Cannot implicitly convert type ExtendedClass to BaseClass
一些简化的上下文:
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;
}
}
}
第二类参数必须设置为int
:
BaseClass<I, int> anInstance = new ExtendedClass<I>();
显然,I
也必须是具体类型或泛型中的其他类型参数 class。
你应该指定参考S
和I
是什么。如果你在class范围之外:
BaseClass<SomeClass, int> anInstance = new ExtendedClass<SomeClass>();
如果您在class
的范围内BaseClass<I, int> anInstance = new ExtendedClass<I>();
S
是在 BaseClass
上下文中为泛型类型指定的名称。它不存在于它之外,并且在像您一样定义引用时必须提供具体类型。