【问题标题】:IronPython overload resolution on generic types泛型类型的 IronPython 重载解析
【发布时间】:2016-01-26 06:39:36
【问题描述】:

我有一个带有重载静态方法的 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[ 诠释])

我的第一个问题是为什么这不起作用?似乎重载解决方案应该对此起作用。这是 IronPython 中的错误吗?什么是最干净的解决方法。我可以重命名例程,这样它们就不会互相重载,但是我让 Ironpython 怪癖改变了 C# 类的设计。

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

this question相关

【问题讨论】:

    标签: ironpython


    【解决方案1】:

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

    等等

    【讨论】:

      【解决方案2】:

      我知道这不是 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)
      

      这篇文章对我帮助很大。感谢分享!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-06
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多