我正在尝试使用委托,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没有直接解决我看到的泛型类型参数案例。谁能解释一下这里发生了什么?
答案 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。