使用相关/派生Ts在泛型中进行投射

时间:2013-05-07 10:41:24

标签: c# generics casting

class BaseItem { }

class DerivedItem : BaseItem { }

interface IInterface<T> where T is BaseItem { }

class RealizedInterface<T> : IInterface<T> { }

RealizedInterface<BaseItem> rb;
RealizedInterface<DerivedItem> rd = new RealizedInterface<DerivedItem>;

有没有任何方法可以投射,如下一行所示:

rb = rd;   

有谁能告诉我如何将rd投射到rb

实际上,BaseItem本身也是一个通用类,但为了简单的问题,没有写出来。 class BaseItem<U,K> / DerivedItem<U,K>

那些能够理解我面临的真正问题的人就是这个。

IShape<IBaseShape<long>, long> shape;

这是一个声明的对象

IShape<ITriangle<long>, long> triangle =new Shape<ITriangle<long>,long>(); //Shape derived from IShape

shape = triangle; //here is the problem.

ITriangle从IBaseShape中获取。我真的很感激任何帮助。

结果:我决定不实施关键字。它并没有给我带来太大的价值(这是一个持续数月的项目,到处都是仿制药)。具体来说,如果您考虑在 in 关键字和带有 out 关键字的getter中的接口中实现setter,那么在使用out关键字修饰的界面中使用泛型创建的转换问题让我认为关于它两次。总而言之,如果你从一开始就使用它们就会很有用,否则它会带来比你想象的更多的问题。

3 个答案:

答案 0 :(得分:5)

您正在寻找的是通用类型的协方差和逆变。您可以阅读here

主题

答案 1 :(得分:1)

如果IShape的定义方式只允许您检索&#34;第一个类型参数的元素,然后将您的定义从IShape<T, U>更改为IShape<out T, U>以告诉编译器,然后一切都会正常工作(给定最新版本的.NET)。

如果IShape定义为您可以&#34;推送&#34;通过接口在中的第一个类型参数的元素,然后此不能工作。如果您将IShape<ITriangle...>隐藏为IShape<IBaseShape...>,那么如果您尝试&#34;推送&#34;进入ISquare

答案 2 :(得分:0)

只要您继续使用接口而不是实际的类,就可以使用协方差/逆变。

像这样:

void Main() {   
    RealizedInterface<BaseItem> rb1;
    RealizedInterface<DerivedItem> rd1 = new RealizedInterface<DerivedItem>();
    rb1 = rd1; // doesn't work

    IInterface<BaseItem> rb2;
    IInterface<DerivedItem> rd2 = new RealizedInterface<DerivedItem>();
    rb2 = rd2; // works
}

// Define other methods and classes here
class BaseItem { }

class DerivedItem : BaseItem { }

interface IInterface<out T> where T:  BaseItem { } // Notice the out keyword!

class RealizedInterface<T> : IInterface<T> where T:BaseItem { }