2010-10-11 54 views
4

我有這樣的重載靜態方法C#類:IronPython的重載

// 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一個線索,該列表完全由一種類型組成,並且它應該選擇一個特定的超載?

相關的this question

回答

8

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

0

我知道這是不是OP的確切問題,但這裏有一個類似的場景與過載和多個參數以防萬一別人是不知道如何解決這個問題:

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

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

這裏是如何與使用,而不是XYZ行特定的過載稱之爲:

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

這篇文章幫了我很多。感謝分享!