PCL - 对于某些目标,无法从Func <IThing <T >>转换为Func <Object>

man*_*art 2 .net c# portable-class-library

我目前有一个PCL库,它包含一个像这样的工厂(更改名称以保护无辜):

public abstract class ThingFactory : IThingFactory
{
    private readonly Dictionary<string, Func<object>> _registrations = new Dictionary<string, Func<object>>();

    protected void Register<T>(string name, Func<IThing<T>> resolver) where T : IModel<T>
    {
        _registrations.Add(name, resolver);
    }

    // ... Resolve casts invocation back to IThing<T>.
}
Run Code Online (Sandbox Code Playgroud)

该库为上面的.NET 4.0和SL 5完美地构建和测试.

任何其他目标(SL 4,Windows手机等)导致转换消息编译失败:

Error 2 Argument 2: cannot convert from 'System.Func<IThing<T>>' to 'System.Func<object>'
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Mar*_*zek 5

那是因为Func<T>在.NET 3.5中以这种方式声明了

public delegate TResult Func<TResult>()
Run Code Online (Sandbox Code Playgroud)

从.NET4开始,声明更改为

public delegate TResult Func<out TResult>()
Run Code Online (Sandbox Code Playgroud)

注意out.NET 3.5声明中缺少关键字.它使通用类型协变.您可以在MSDN上阅读关于.NET 协方差和逆变支持的非常好的解释.