2017-09-13 5 views
0

J'ai une méthode d'extension:Pourquoi une extension de <T> Nullable ne peut-elle pas être utilisée sur une valeur de type T?

public static int DoStuff(this MyEnum? enumValue) 
{ 
    ... 
} 

Je veux invoquer sur une valeur de MyEnum qui est connu pour être non nulle:

MyEnum enumVal = ... 
var x = enumVal.DoStuff(); // compiler error! 

Erreur:

error CS1928: 'MyEnum' does not contain a definition for 'DoStuff' and the best extension method overload 'MyExtensions.DoStuff(MyEnum?)' has some invalid arguments

I peut contourner ce problème en déclarant une surcharge de l'extension:

public static int DoStuff(this MyEnum enumValue) 
{ 
    return DoStuff((MyEnum?)enumValue); 
} 

Sinon, je peux invoque la classe d'extension explicitement:

var x = MyExtensions.DoStuff(enumVal); 

Mais est non-intuitive. Pourquoi une extension Nullable<T> ne peut-elle pas accepter une valeur de type T, comme n'importe quelle signature de méthode normale?

+3

car 'MyEnum' n'est pas NULL – Rahul

+1

ils ne sont pas du même type. –

+0

En plus d'un 'Nullable ' n'est certainement pas un 'T'. –

Répondre

5

Fondamentalement, les méthodes d'extension (contrairement aux arguments de méthode) ne tiennent pas compte des conversions implicites. Et MyEnum? value = nonNullableMyEnumValue utilise la conversion implicite, ce n'est pas le même type. Vous courriez dans la même situation avec n'importe quel autre type implicitement convertible.