generics类的协方差
在C#中有什么方法可以实现以下目的:
class MyClass where T : BaseTypeInner {} class BaseTypeInner {} class A : BaseTypeInner {} class B : BaseTypeInner {} void Main() { MyClass variant; variant = new MyClass (); // ERROR: Cannot implicitly convert type 'UserQuery.MyClass' to 'UserQuery.MyClass' variant = new MyClass (); }
在C#中,只有接口可以是变体。 引用C#规范:
变体类型参数列表只能出现在接口和委托类型上。
因此,您可以声明一个通用的协变接口IBaseClass
,使BaseClass
实现它,然后转换为IBaseClass
而不是转换为类。
interface IMyClass where T : BaseTypeInner { } class MyClass : IMyClass where T : BaseTypeInner { }
IMyClass variant; variant = new MyClass(); // works just fine variant = new MyClass();
一种可能的解决方案是为基本generics类型提供基类型:
class BaseType {} class MyClass : BaseType where T : BaseTypeInner {} class BaseTypeInner {} class A : BaseTypeInner {} class B : BaseTypeInner {} void Main() { BaseType variant; variant = new MyClass (); variant = new MyClass (); }
但是,这不是一个好主意,因为我使用的是较低的类,这不是通用的,所以我失去了使用类型参数得到的所有细节和限制。
不,但是可以提供自定义CastUp
/ CastDown
方法来实现此目的。 ImmutableArray
是.NET BCL的一部分。
- 如何从SQL Server 2008错误代码中识别主键重复?
- 如何通过扩展方法,静态类中的方法以及使用Roslyn的ref / out参数的方法来访问调用
- 架构问题:我应该在哪个组件中放置哪个类,以获得干净的解决方案?
- 使用Response.TransmitFile使物理文件无法正常工作
- 如何使用JavaScriptSerializer使用数字键解析JSON对象
- 如何将Foreach语句转换为linq表达式?
- 不使用Ghostscript DLL将PDF转换为图像
- 使用SelfHosting时,我可以自动托管app.config中的所有服务吗?
- AngularJs和ASP.NET MVC 5-ng-model覆盖文本框值