你可以使用特定类型的类对泛型类进行子类化吗?

Gen*_*ari 9 .net c# generics subclass

我有一个泛型类,其子类提供特定类型.

public abstract class GenericBase<T>
    where T:Interface1
{
}
Run Code Online (Sandbox Code Playgroud)

我将泛型与特定实现子类化:

public class Customer:
    GenericBase<Type1>
Run Code Online (Sandbox Code Playgroud)

(Type1实施Interface1).

我有另一个抽象基类,它引用了这个:

protected GenericBase<Interface1> genericInstance;
Run Code Online (Sandbox Code Playgroud)

最后,当我尝试将genericInstance分配给基类的实例时,它给了我一个编译器错误,说它"无法隐式地将Customer转换为GenericBase <Interface1>".

base.genericInstance = new Customer(); //Compiler error
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我会得到这个错误,如果Customer是一个子类型GenericBase<Type1>Type1实现Interface1.是不是Customer有效的一种类型GenericBase<Interface1>,如果它是一个子类GenericBase<Type1>

我想我在这里误解了一些关于泛型的东西; 有没有办法允许这种行为?

Dav*_*d L 11

在C#中,协方差(将派生类型分配给基类型)不能应用于泛型类.因此,您需要在新接口上使用out参数修饰符来应用专门标记为协变的IGenericBase接口.

protected IGenericBase<Interface1> genericInstance = new Customer();

public interface IGenericBase<out T> {}

public abstract class GenericBase<T> : IGenericBase<T>
    where T:Interface1 {}

public interface Interface1 {}

public class Type1 : Interface1 {}

public class Customer: GenericBase<Type1> {}
Run Code Online (Sandbox Code Playgroud)

  • 我知道C#的运算符类似于Java的奇怪`<?扩展T>`和`<?super T>`syntax,我只是不知道它们是`<在T>`和`<out T>`. (2认同)