2010-01-23 7 views
5

Pourquoi cette conversion ne fonctionne-t-elle pas?Conversion opérateur implicite et génériques

public interface IMyInterface 
{ 
} 

public interface IMyInterface2 : IMyInterface 
{ 
} 

public class MyContainer<T> where T : IMyInterface 
{ 
    public T MyImpl {get; private set;} 
    public MyContainer() 
    { 
      MyImpl = Create<T>(); 
    } 
    public static implicit T (MyContainer<T> myContainer) 
    { 
     return myContainer.MyImpl; 
    } 
} 

Quand j'utilise ma classe, il provoque une erreur de compilation:

IMyInterface2 myImpl = new MyContainer<IMyInterface2>(); 

peut convertir de MyContainer <IMyInterface2> pour IMyInterface2 ... hmmmm

+2

J'ai rencontré ce même problème. Ce n'est pas un bug dans le compilateur, mais plutôt une partie documentée de la spécification. Voir http://stackoverflow.com/questions/1208796/c-compiler-bug-why-doesnt-this-implicit-user-defined-conversion-compile Un membre respecté de l'équipe du compilateur C# a ajouté une réponse à ce qui précède question et ajouté, "c'est une partie très, très confuse de la spécification". –

+0

Merci pour le suivi. C'est utile. Je ne pensais pas que c'était un bug mais peut-être quelque chose que je n'ai pas compris à propos de la spécification, ce qui s'est avéré être. Ça craint parce que ça aurait rendu mon code beaucoup plus propre ... eh bien. Je suppose que je vais juste écrire ma propre langue: P –

+0

Je vous entends. J'ai quelques structs comme NonNull et peut-être , et la conversion de/vers ces types serait beaucoup plus propre si la spécification autorisée pour ce scénario. Je souhaite qu'ils changeraient les spécifications; Je préférerais avoir la possibilité de conversions moins coûteuses et activer ce scénario de conversion implicite. –

Répondre

5

Vous ne pouvez pas définir une conversion implicite à une interface. Par conséquent, votre opération implicite générique ne sera pas valide pour les interfaces. Voir blackwasp.co.uk

You may not create operators that convert a class to a defined interface. If conversion to an interface is required, the class must implement the interface.

Vous pouvez juste finir par écrit ce qui suit, sans implicite magique:

IMyInterface2 myImpl = new MyContainer<IMyInterface2>().MyImpl; 
3

Il a à voir avec le fait que IMyInterface2 est une interface, si vous remplacez avec

public class MyClass2 : IMyInterface 
{ 
} 

cela fonctionne.

Voici la référence, 10.9.3

Questions connexes