无法将GenericClass 强制转换为GenericClass [复制]

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我正在创建一个可以存储任何类型数据的容器。要从容器获取数据,我可以使用以下方法:AnyTypeResult<T> Get<T>(string name)-从注册为“名称”的容器数据返回并将其强制转换为T。业务逻辑要求,当我们将数据作为DerivedClass的GenericType添加到容器时,可以将其作为BaseClass的GenericType获取。最好的方法是什么?

相同的问题是,当我们要将List<B>强制转换为List<A>时。可以做女巫Linq扩展方法Cast<T>

public class A {}
public class B : A {}
public class C<T> {}

var a = new C<A>();
var b = new C<B>();

var x = (C<A>)b; // cannot convert type
c# generics casting base derived
1个回答
0
投票

[GenericClass<DerivedClass>GenericClass<BaseClass>以及GenericClass<>的两个截然不同的闭合构造的泛型类型都是开放的泛型类型,它们不能彼此继承。

因此,即使GenericClass<B>继承自GenericClass<A>,也无法将B强制转换为A。>

就像您要求投射此内容:

class A2 : A1;
class B2 : B1;

var a2 = new A2();
var b2 = new B2();
var x = (A1)b2;

[GenericClass<DerivedClass>GenericClass<BaseClass>A1B2一样不同。

但是它们都是object

并且由于C#中还没有Diamond运算符,因此您不能在像这样的封闭构造类型基础上的开放通用类型上使用真正的多态性:

var x = (GenericClass<>)b;

您无法创建这样的列表:

List<> list;

您不能在这样的列表上进行多态性处理...而且这里缺乏通用性。

例如,在C#中,您无法创建List<Washer<>>实例来使它们具有某些Washer<Cat>和某些Washer<Dog>来对其进行操作Wash() ...为此,您需要一个丑陋的非通用接口模式...

Generics -Open and closed constructed Types

© www.soinside.com 2019 - 2024. All rights reserved.