2011-09-21 55 views
2

分配給Func鍵 如果我有 無法從Func鍵<T>

public class MyClass 
{ 
    public Func<IModel> InputFunc { get; set; } 
} 

,並嘗試做

public void SetInput<TInput>(Func<TInput> funcInput) where TInput:IModel 
{ 
    ... 
    var c = new MyClass(); 
    c.InputFunc = funcInput; 
    ... 
} 

我得到一個編譯錯誤

Cannot implicitly convert type 'System.Func<TInput>' to 'System.Func<IModel>' 

爲什麼會這樣造成的? 我該如何解決這個問題? (我試過的where子句,但並沒有幫助)

+2

罰款這應該是你使用的版本是C#4罰款.NET 4? – CodesInChaos

+0

嗯,它不會因爲某種原因在C#4中編譯。 – CodesInChaos

+0

我在Visual Studio 2010 Professional上使用C#4。 – mhttk

回答

6

兩種可能性:

  1. 你可能會使用C#3/.NET 3.5(或更早)。

    的接口和委託通用協方差在C#4

  2. 只介紹這只是因爲你還沒有要求TInput是引用類型。試試這個:

    void SetInput<TInput>(Func<TInput> func) where TInput : class, IModel 
    

    這是必需的,否則TInput可能是一個值類型實施IModel(我假設IModel在接口),並且不支持協方差的值類型(由於代表性的差異) 。

我只是額外的約束試了一下,它在C#4

+0

太棒了!是的,IModel是一個界面,調整效果很好。謝謝。 – mhttk

相關問題