代码之家  ›  专栏  ›  技术社区  ›  Dr. Strangelove

C#协方差:具有不同接口特征的类

  •  2
  • Dr. Strangelove  · 技术社区  · 7 年前

    我有一个具有以下签名的基类:

    abstract class BaseClass<I, S>
    

    然后我定义了一个具有以下签名的类来扩展 BaseClass :

    class ExtendedClass<I> : BaseClass<I, int>
    

    所以 ExtendedClass 设置 S 的泛型类型 基类 具有 int 论点我使用的课程如下:

    BaseClass<I, S> anInstance = new ExtendedClass<I>();
    

    这会引发以下错误:

    无法将类型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;
            }
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   Gilad Green Fábio    7 年前

    您应该指定什么作为参考 S I 是如果您不在课程范围内:

    BaseClass<SomeClass, int> anInstance = new ExtendedClass<SomeClass>();
    

    如果你在课程范围内

    BaseClass<I, int> anInstance = new ExtendedClass<I>();
    

    S 是在上下文中为泛型类型指定的名称 BaseClass . 它不存在于它之外,当定义引用时,您必须给出具体类型。

        2
  •  3
  •   adjan    7 年前

    第二个类型参数必须设置为 int :

    BaseClass<I, int> anInstance = new ExtendedClass<I>();
    

    明显地 I 也必须是泛型类中的具体类型或其他类型参数。