先前文章文末提過一篇Silverlight interoperability,裡面有一句話

We have basic support for method overloading, by finding the overload which matches the number of arguments and by doing some basic parameter validation.

引起我的興趣,做了點研究,大致心得如下:

  1. 透過參數數目不同,Javascript呼叫時可精準地判別切換Overloading。(給個"讚"!)
  2. 如果參數數目相同,Siverlight Plugin還是能很粗略地依Javascript參數型別做判斷,但由於Javascript世界型別並不明確,判別精準度有限,如下面這個機車的例子:
        public class JavascriptSidekick
        {
            [ScriptableMember]
            public string Test(double d)
            {
                return "Double";
            }
            [ScriptableMember]
            public string Test(bool b)
            {
                return "Bool";
            }
            [ScriptableMember]
            public string Test(string s)
            {
                return "String";
            }
            [ScriptableMember]
            public string Test(ScriptObject o)
            {
                return "ScriptObject";
            }
        }

    用以下Javascript測試:
    alert(jssk.Test(1));
    alert(jssk.Test(true));
    alert(jssk.Test(3.14));
    alert(jssk.Test("Darkthread"));
    alert(jssk.Test(document.getElementById("form1")));

    結果挺有趣的,1, true, 3.14都會得到Double,"Darkthread"得到String,getElementById("form1")則出現HtmlElement轉型String錯誤。如果把Souce Code中Test(bool b)的順序移到Test(double d)之前,則1, true, 3.14都會傳回Bool。
    以此推測,Silverlight應是透過嘗試轉型來處理同參數數目的Overloading識別,1, true, 3.14都可被視為Boolean或Double,因此以Method的先後決定。而其餘非String的型別會被當成String處理,多半會造成轉型失敗。

由以上測試結果,建議不要依賴參數型別做為Javascript呼叫Silverlight時Overloading的依據,還是回歸參數數目區隔較為保險,避免自找麻煩。


Comments

Be the first to post a comment

Post a comment


69 - 54 =