泛型参数的C#类型转换

时间:2010-08-24 18:00:53

标签: c# generics interface

这是一个相当基本的C#问题;我道歉,但我无法在其他地方找到这个。

Object<class>转换为Object<interface>的最佳方式是什么?

//fake interface
interface ignu {}

//fake class which implements fake interface
class bee : ignu {}

//function which accepts a generic with the interface
function bang(template<bee>) {}

//template type but with a class that implements the interface
template<bar> foo;

//trying to call the function, but compiler complains it can't implicitly convert
bang(foo); 

//compilers complains that it cannot convert from template<bee> to template<ignu>
bang((template<ignu>)bee)

也许我已经离开了基地,但这似乎应该可行并且可行,但解决方案正在逃避我。

编辑:将mygen更改为模板,因为我使用两者来引用同样令人困惑的事情

编辑:我最终使用类似于的Cast:     砰(bee.Cast());

4 个答案:

答案 0 :(得分:2)

无法保证Generic<SubType>实际上可以替代Generic<BaseType>

考虑一下:

List<int> intlist = new List<int>();
List<object> objlist = intlist; // compile error
objlist.Add("foo"); // what should be in intlist now?

您正在寻找的是共同和反差。它们已被添加到c#4中。

答案 1 :(得分:1)

它应该是,并且在.Net 4.0中。

检查出来:http://msdn.microsoft.com/en-us/library/dd799517.aspx

答案 2 :(得分:1)

.NET 3.5在泛型中没有Covariance和Contravariance,正如MonkeyWrench指出的那样。但是,有必要进行铸造的方法。

class Program
{
    static void Main(string[] args)
    {
        List<ccc> c = new List<ccc>();
        c.Add(new ccc());

        List<iii> i = new List<iii>(c.Cast<iii>());
    }
}

interface iii
{
    void DoIt();
}

class ccc : iii
{
    public void DoIt()
    {
        throw new NotImplementedException();
    }
}

答案 3 :(得分:0)

在.NET 3.5中,我会在如下列表中处理类似的内容:

list<bar> myList = new list<bar>;
myList.Select<ignu>(x => x).ToList();

我认为对单个对象做类似的事情并不难。