2011-09-21 4 views
2

Si jene peut pas affecter à Func <Interface> de Func <T>

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

et essayer de faire

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

Je reçois une compilation erreur

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

Pourquoi est-ce fait? Comment puis-je résoudre ce problème? (j'ai essayé la clause where mais n'aide pas)

+2

Cela devrait être bien en C# 4 sur .net 4. Quelle version utilisez-vous? – CodesInChaos

+0

Hmm il ne compile pas pour une raison quelconque dans C# 4. – CodesInChaos

+0

J'utilise C# 4 sur Visual Studio 2010 Professional. – mhttk

Répondre

6

Deux possibilités:

  1. Vous utilisez probablement C# 3/.NET 3.5 (ou plus tôt).

    covariance générique pour les interfaces et les délégués n'a été introduite en C# 4.

  2. Il est juste parce que vous ne l'avez pas nécessaire que TInput est un type de référence. Essayez ceci:

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

    Cela est nécessaire car sinon TInput pourrait être un type de valeur mise en œuvre IModel (je suppose IModel est une interface) et covariance est pas pris en charge pour les types de valeur (en raison des différences de représentation) .

J'ai juste essayé avec la contrainte supplémentaire, et il est très bien en C# 4.

+0

Brillant! Oui, IModel était une interface et le tweak fonctionnait bien. Je vous remercie. – mhttk

Questions connexes