使用泛型类型参数进行协方差和反方差运算



我正在尝试使用委托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.

相关内容

  • 没有找到相关文章

最新更新