我正在尝试使用委托Func<对象T>,协变地没有成功。尽管T可转换为对象,Func<对象,T>似乎不能转换为Func<对象,对象>即使Func<对象,字符串>(或任何其他混凝土类型)可以转换为Func<对象,对象>正如预期的那样。请参阅下面演示问题的代码。
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文档并没有直接处理泛型类型参数的情况。有人能解释一下这里发生了什么吗?
您需要对泛型参数应用类型约束。
将您的功能原型更改为:
public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) where T : class
在行中:
Func<object[], object> f2 = input => new object();
您还需要将正在创建的对象强制转换为T.