我有一个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:多个目标可以匹配:Foo(IEnumerable [str]),Foo(IEnumerable [
int])

我的第一个问题是为什么这行不通?似乎过载解析应该可以解决此问题。这是IronPython中的错误吗?什么是最干净的解决方法。我可以重命名例程,以便它们不会彼此重载,但是随后,我让ironpython怪癖更改了C#类的设计。

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

关于this question

最佳答案

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")

等等。

关于ironpython - IronPython重载类型的重载解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3907886/

10-15 19:20