2013-03-22 90 views
2

我現在有,包含了工廠像這樣一個PCL庫(名稱變更爲保護無辜者):PCL - 無法從Func鍵<IThing<T>>轉換爲Func鍵<Object>一些目標

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>. 
} 

庫構建和測試完全爲上述.NET 4.0和SL 5.

任何其他目標(SL 4,視窗電話等)引起與變換消息編譯失敗:

Error 2 Argument 2: cannot convert from 'System.Func<IThing<T>>' to 'System.Func<object>' 

有什麼建議嗎?

回答

2

您可以使用此代碼解決這個問題:

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

我猜的原因是,預.NET 4.0沒有用於FUNC /動作無變化支持

+0

這很簡單。乾杯。 – manadart 2013-03-22 09:16:26

5

這是因爲Func<T>被宣佈這種方式.NET 3.5

public delegate TResult Func<TResult>() 

從.NET4開始申報改爲

public delegate TResult Func<out TResult>() 

公告在.NET 3.5聲明中缺少out關鍵字。它使通用類型協變。你可以在MSDN上閱讀有關.NET covariance and contravariance支持的很好的解釋。

+0

+1表示澄清。 – manadart 2013-03-22 09:19:43

相關問題