1

我正在尝试协变地使用委托 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 文档没有直接从我所看到的中解决泛型类型参数的情况。谁能解释这里发生了什么?

4

1 回答 1

0

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

将您的函数原型更改为:

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

在这一行:

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

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

于 2012-07-19T05:15:27.003 回答