C# 4.0 协方差和逆变换是否适用于泛型类型参数?
我尝试使用委托Func,但没有成功。尽管T可以转换为对象,但Func似乎不能转换为Func,即使Func(或任何其他具体类型)可以按预期转换为Func。请参阅下面演示问题的代码C# 4.0 协方差和逆变换是否适用于泛型类型参数?,c#-4.0,delegates,covariance,C# 4.0,Delegates,Covariance,我尝试使用委托Func,但没有成功。尽管T可以转换为对象,但Func似乎不能转换为Func,即使Func(或任何其他具体类型)可以按预期转换为Func。请参阅下面演示问题的代码 public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) { object o1; T o2
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
}
公共无效寄存器(表达式工厂、Func构造函数选择谓词)
{对象o1;
T o2=默认值(T);
o1=o2;//工作正常
Func f1=o=>o.GetType();
Func f2=o=>o作为T;
f1=f2;//给出转换错误。
f1=f2 as Func;//f2 as Func始终为空
Func f1=input=>input.GetType().Name;
Func f2=输入=>新对象();
f2=f1//工作正常
}
从我所看到的情况来看,没有直接解决泛型类型参数的情况。有人能解释一下这里发生了什么吗?您需要对泛型参数应用类型约束 将您的功能原型更改为:
public void Register<T>(Expression<Func<object[], T>> factory, Func<bool> constructorSelectionPredicate) where T : class
公共无效寄存器(表达式工厂,Func构造函数选择谓词),其中T:class
在这方面:
Func<object[], object> f2 = input => new object();
Func f2=input=>newobject();
。。。您还需要将正在创建的对象强制转换为T。确定吗?我以前尝试过类约束,但没有成功。我还尝试使用
where T:object
,但编译器不允许这样做。不过我会再检查一遍,以确保我没有因为睡眠不足而犯下其他愚蠢的错误!当我做了上面提到的两个更改时,它为我编译了。。。编译器现在给你的错误是什么?或者是你看到的一些奇怪的运行时行为?