IronPython 对泛型类型的重载解析

标签 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"])

类型错误:多个目标可以匹配:Foo(IEnumerable[str]), Foo(IEnumerable[
内部])

我的第一个问题是为什么这不起作用?似乎重载决议应该对此起作用。这是 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 对泛型类型的重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3907886/

相关文章:

c# - 在 Python 中使用 System.Collections.Generic.List`1[System.Byte]

Python - 如何定义不受 __getattr__ 影响的属性?

visual-studio-2010 - 有没有一种实用的方法可以完全在 VS 2k10 IDE 中使用 IronPython?

python - 在 jupyter 中以 for 循环播放音频

python - 如何从 IronPython 更新 WPF DataGrid 一行的值?

python - 我可以将所有标准 Python 库与 IronPython 一起使用吗?

python - IronPython 和 WPF : Binding a checkbox's IsChecked property to a class member variable

python - 在 IronPython 中将复选框绑定(bind)到字符串

c# - C# 中的 Python UnboundNameException

c# - 从 IronPython 调用 C# 函数