erreur d’opérateur de conversion explicite lors de la conversion de listes génériques

Je crée un opérateur de conversion explicite pour convertir une liste générique de types d’entités en une liste générique de types de modèles. Est-ce que quelqu’un sait pourquoi j’obtiens l’erreur suivante:

La conversion définie par l’utilisateur doit être convertie vers ou à partir du type englobant

J’ai déjà un opérateur de conversion explicite entre Entity.objA et Model.objA qui fonctionne bien. Le problème se pose lorsque vous essayez de convertir la liste générique. Est-ce seulement possible?

Voici mon code:

public static explicit operator List(List entities) { List objs= new List(); foreach (Entity.objA entity in entities) { objs.Add((Model.objA)entity); } return claims; } 

Merci pour toute aide.

    L’erreur “La conversion définie par l’utilisateur doit convertir vers ou à partir du type englobant” indique exactement ce que cela signifie. Si vous avez un opérateur de conversion

     class MyClass { public static explicit operator xxx(ssortingng s) { // details } public static implicit operator ssortingng(xxx x) { // details } } 

    Alors xxx doit être MyClass . C’est ce que l’on entend par “la conversion doit convertir vers ou du type englobant”. Le type englobant ici est MyClass .

    La section pertinente de la spécification ECMA334 C # est 17.9.4:

    Un opérateur de conversion convertit un type de source, indiqué par le type de paramètre de l’opérateur de conversion, en un type cible, indiqué par le type de retour de l’opérateur de conversion. Une classe ou une structure est autorisée à déclarer une conversion d’un type de source S en un type de cible T uniquement si tous les éléments suivants sont vrais, où S0 et T0 sont les types résultant de la suppression de la fin? Modificateurs, le cas échéant, de S et T:

    S0 et T0 sont de types différents.

    S0 ou T0 est le type de classe ou de structure dans lequel la déclaration de l’opérateur a lieu.

    Ni S0 ni T0 n’est un type d’interface.

    À l’exclusion des conversions définies par l’utilisateur, il n’existe pas de conversion de S en T ni de T en S.

    Alors, voici votre code:

     public static explicit operator List(List entities) { List objs= new List(); foreach (Entity.objA entity in entities) { objs.Add((Model.objA)entity); } return claims; } 

    Le problème est que pour que cela soit défini en tant qu’opérateur de conversion, il doit résider dans les List ou List , mais vous ne pouvez bien sûr pas le faire car vous n’avez pas le droit de les modifier. les types.

    Vous pouvez utiliser Enumerable.Select pour projeter sur l’autre type ou List.ConvertAll . Par exemple:

     public static class ListExtensions { public static List ConvertToModel(this List entities) { return entities.ConvertAll(e => (Model.objA)e); } } 

    En gros, vous ne pouvez pas faire ça. Dans votre opérateur, le type d’entrée ou de sortie doit être du type qui déclare l’opérateur. Une option peut être une méthode d’extension, mais pour être honnête, LINQ Select est assez proche, tout comme List.ConvertAll .

    Comme exemple de l’approche de la méthode d’extension:

     public static class MyListUtils { public static List ToModel(this List entities) { return entities.ConvertAll(entity => (Model.objA)entity); } } 

    ou plus généralement avec LINQ Select :

     public static class MyListUtils { public static IEnumerable ToModel( this IEnumerable entities) { return entities.Select(entity => (Model.objA)entity); } } 

    et utilisez juste someList.ToModel() .