Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 协方差和逆变换是否适用于泛型类型参数?_C# 4.0_Delegates_Covariance - Fatal编程技术网

C# 4.0 协方差和逆变换是否适用于泛型类型参数?

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

我尝试使用委托Func,但没有成功。尽管T可以转换为对象,但Func似乎不能转换为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

    }
公共无效寄存器(表达式工厂、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
,但编译器不允许这样做。不过我会再检查一遍,以确保我没有因为睡眠不足而犯下其他愚蠢的错误!当我做了上面提到的两个更改时,它为我编译了。。。编译器现在给你的错误是什么?或者是你看到的一些奇怪的运行时行为?