2012-02-07 14 views
2

我想能夠調用具有Nullable參數的泛型foo方法。當Foo方法的主體調用Foo()時,它會遞歸,導致堆棧溢出(沒有.com)。有沒有辦法讓if語句中的調用與運行時類型調用正確的重載?具有可爲空的參數調用的泛型重載方法具體類型

我知道更改名稱會做到這一點,我明白爲什麼遞歸發生,但不知道另一種方式來寫這個。

感謝您的期待。

class Program { 
    static void Main(string[] args) { 
     int? x = 5; 
     int y = 10; 
     Foo(x, y); 
    } 

    static void Foo<T>(Nullable<T> arg, T defaultValue) where T : struct { 
     if (arg.HasValue) 
      Foo(arg.Value, defaultValue); 
    } 

    static void Foo(int arg, int defaultValue) { 
     Console.WriteLine(string.Format("I'm an int arg={0}, default={1]}", arg, defaultValue)); 
    } 

    static void Foo(string arg, int defaultValue) { 
     Console.WriteLine(string.Format("I'm an string arg={0}, default={1]}", arg, defaultValue)); 
    } 

    static void Foo(bool arg, int defaultValue) { 
     Console.WriteLine(string.Format("I'm an double arg={0}, default={1]}", arg, defaultValue)); 
    } 
} 
+1

你期望'雙?'去哪兒? – 2012-02-07 04:02:53

+0

嘗試在調用中明確地轉換參數Foo() – logicnp 2012-02-07 04:12:22

回答

1

泛型是一種編譯時功能,在程序運行之前決定了重載分辨率。如果您想按照您的說法強制執行運行時決策,則可以使用dynamic來實現該目標(在C#4 +中)。除此之外,您只需轉換爲int和bool之間的適用類型。

if (arg.HasValue) 
     Foo((dynamic)arg.Value, defaultValue); 

但要小心!這隻能解決您的問題intbool。其他類型可以傳遞給泛型方法,並且這些類型將繼續在後續調用中解析爲泛型方法。

Foo(5.0, 10.0); // would still overflow with your given methods 

按照你的初步判斷,如果你想支持intstring,並且bool,只是有那些重載。如果你想支持任何給定的T,創建一個過載T.

static void Foo<T>(T arg, T defaultValue) 
{ 
    Console.WriteLine(string.Format("I'm a T arg={0}, default={1}", arg, defaultValue)); 
} 

重載決策仍然會挑intboolstring,或T?過載,如果基於編譯時間信息它們適用。所有其他呼叫,arg.Value的呼叫,都將進入此新的過載狀態。

+0

另外,請參閱http://en.wikipedia.org/wiki/Double_dispatch – 2012-02-07 04:26:31

+0

謝謝安東尼,動態做了我想做的事情。由於我提供的樣本不是我的真實代碼,因此可以傳遞的數量有限。我喜歡將所有方法改爲一種通用方法的想法。我會去看看我的重載是否可以支持。非泛型方法是遺留代碼,所以我想限制引入的新代碼的數量。 – user1193745 2012-02-07 16:03:12

相關問題