关于泛型类型的IronPython重载决策

时间:2010-10-11 16:02:21

标签: ironpython

我有一个带有重载静态方法的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中的错误吗?什么是最干净的解决方法。我可以重命名例程,这样它们就不会相互重载,但是后来我让铁心的怪癖改变了C#类的设计。

有没有一种干净的方法可以让python知道列表完全由一种类型组成,并且它应该选择一个特定的重载?

this question

相关

2 个答案:

答案 0 :(得分:9)

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 :(得分:1)

我知道这不是OP的确切问题,但这里有类似的重载和多个参数情况,以防其他人想知道如何解决它:

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)

这篇文章给了我很多帮助。感谢分享!