协方差和逆变法是否与泛型类型参数一起使用?

时间:2012-07-19 05:06:09

标签: c#-4.0 delegates covariance

我正在尝试使用委托,Func< object,T>,共同没有成功。尽管T可以转换为对象,但是Func< object,T>似乎无法转换为Func< object,object>即使Func< object,string> (或任何其他具体类型)可以转换为Func< object,object>正如所料。请参阅下面演示此问题的代码。

public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) 
    {   object o1;
        T o2 = default(T);
        o1 = o2; // works fine

        Func<object, object> f1 = o => o.GetType();
        Func<object, T> f2 = o => o as T;

        f1 = f2; //gives conversion error.
        f1 = f2 as Func<object, object>; // f2 as Func<object, object> is always null

        Func<object[], string> f1 = input => input.GetType().Name;
        Func<object[], object> f2 = input => new object();

        f2 = f1 // works fine

    }

msdn documentation没有直接解决我看到的泛型类型参数案例。谁能解释一下这里发生了什么?

1 个答案:

答案 0 :(得分:0)

您需要对通用参数应用类型约束。

将您的函数原型更改为:

public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) where T : class

在这一行:

Func<object[], object> f2 = input => new object();

...您还需要将正在创建的对象强制转换为T。