2010-10-11 5 views
4

J'ai une classe C# avec des méthodes statiques surchargées comme celles-ci:IronPython résolution de surcharge sur les types génériques

// Added to the Simple class in Tutorial\Extend\csextend.cs 
public static int Foo(IEnumerable<int> values) 
{ 
    return 1; 
} 

public static int Foo(IEnumerable<string> values) 
{ 
    return 2; 
} 

Je reçois une erreur lorsque je tente d'appeler ceux-ci de IronPython 2.6. Je passe une liste python qui contient des chaînes.

import clr 
clr.AddReferenceToFile("csextend.dll") 
import Simple 

Simple.Foo(["alpha", "bravo", "charlie"]) 
 
TypeError: Multiple targets could match: Foo(IEnumerable[str]), Foo(IEnumerable[ 
int]) 

Ma première question est pourquoi ne pas ce travail? Il semble que la résolution de surcharge devrait fonctionner sur ceci. Est-ce un bug dans IronPython? Quelle est la solution de contournement la plus propre? Je pourrais renommer les routines pour qu'elles ne se surchargent pas, mais je laisserai alors les caprices de ironpython modifier la conception de la classe C#.

Existe-t-il un moyen propre de donner à python un indice que la liste est entièrement composée d'un type, et qu'elle devrait choisir une surcharge spécifique?

liés à this question

Répondre

8

IronPython n'a pas vraiment de fonctions, les surcharges juste une seule fonction avec toutes les fonctionnalités. Normalement IronPython le ferait automatiquement mais les types génériques compliquent les choses. Pour désambiguïser la surcharge à utiliser, obtenez la fonction en utilisant le dictionnaire Overloads en passant les types dans la signature comme clé. (J'utilise IronPython 2.7 au moment de la rédaction de ce donc je ne sais pas s'il y a une différence entre la version 2.6 et 2,7)

import System.Collections.Generic.IEnumerable as IEnumerable 
Simple.Foo.Overloads[IEnumerable[str]](["alpha", "bravo", "charlie"]) 

S'il y avait plus de paramètres dans les fonctions, passer les types en tant que un tuple.

#public static int Foo(IEnumerable<string> values, string otherParam) 
#{ 
# return 3; 
#} 

Simple.Foo.Overloads[IEnumerable[str],str](["alpha", "bravo", "charlie"], "x") 

etc.

0

Je sais que ce n'était pas la question exacte OP, mais voici un scénario similaire avec les surcharges et les multiples paramètres juste au cas où quelqu'un d'autre se demande comment le résoudre:

public FamilyInstance NewFamilyInstance(
XYZ origin, 
FamilySymbol symbol, 
View specView 
) 

public FamilyInstance NewFamilyInstance(
Line line, 
FamilySymbol symbol, 
View specView 
) 

Et voici comment appeler avec une surcharge spécifique qui utilise la ligne au lieu de XYZ:

doc.Create.NewFamilyInstance.Overloads[Line, FamilySymbol, View](crv, symbol, view) 

Ce message m'a beaucoup aidé. Merci d'avoir partagé!

Questions connexes