Разрешение перегрузки IronPython для универсальных типов - PullRequest
6 голосов
/ 11 октября 2010

У меня есть класс C # с перегруженными статическими методами, такими как:

// 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;
}

Я получаю ошибку, когда пытаюсь вызвать их из IronPython 2.6.Я передаю список python, содержащий строки.

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

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

Мой первый вопрос: почему это не работает?Кажется, что разрешение перегрузки должно работать на этом.Это ошибка в IronPython?Какой самый чистый обходной путь.Я мог бы переименовать подпрограммы, чтобы они не перегружали друг друга, но тогда я позволю причудам ironpython изменить дизайн класса C #.

Есть ли чистый способ дать Python подсказку, что список полностью состоит из одного типа, и что он должен выбрать определенную перегрузку?

Относится к этому вопросу

Ответы [ 2 ]

9 голосов
/ 11 октября 2010

IronPython на самом деле не перегружен функциями, только одна функция со всеми функциями. Обычно IronPython делает это автоматически, но универсальные типы усложняют ситуацию. Чтобы устранить неоднозначность, какую перегрузку использовать, получите функцию, используя словарь Overloads, передавая типы в сигнатуре в качестве ключа. (Я использую IronPython 2.7 на момент написания этой статьи, поэтому я не знаю, есть ли разница между версией 2.6 и 2.7)

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

Если в функциях было больше параметров, передайте типы как кортеж.

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

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

и т.д.

1 голос
/ 26 января 2016

Я знаю, что это был не точный вопрос ОП, но вот похожий сценарий с перегрузками и несколькими параметрами на случай, если кто-то еще задается вопросом, как его решить:

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

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

А вот как вызвать его с определенной перегрузкой, использующей Line вместо XYZ:

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

Этот пост мне очень помог. Спасибо, что поделился!

...