2013-08-20 145 views
2

在C++模板中,您可以將值作爲參數傳遞給template of a function。我怎樣才能在C#中做同樣的事情?如何將值傳遞給C#泛型?

舉例來說,我想要做類似如下的內容:

template <unsigned n> struct Factorial { 
    enum { 
     result = n * Factorial<n - 1>::result; 
    }; 
}; 
template <> struct Factorial<0> { 
     enum { 
     result = 1; 
     }; 
}; 

但在C#。我怎樣才能做到這一點?順便說一下,我對它們的實際需求涉及按需生成類(有幾個靜態值已更改),所以提供的代碼僅僅是一個示例。

+0

這是否等同於通用方法?我不知道任何關於C++。 –

+0

不,模板允許傳入值,而泛型僅允許類型。我正在尋找一種解決方法來實現將值傳遞爲模板參數的相同效果,但在C#中(如果不允許) – pretobomba

+0

我不明白在面向對象的方法中這很有用。 –

回答

4

C#泛型不像這樣使用C++模板。他們只使用類型而不使用值。

+1

我知道,我正在尋找解決方法。 – pretobomba

+0

@pretobomba你可以只寫一個階乘作爲遞歸函數。 –

+0

呵呵呵,我對它們的實際需求涉及按需生成類(幾個靜態值已更改)。遞歸函數適用於我給出的示例,但它不是泛型的侷限性的完整解決方法。 – pretobomba

3

但在C#中。我怎樣才能做到這一點?順便說一下,我對它們的實際需求涉及按需生成類(有幾個靜態值已更改),所以提供的代碼僅僅是一個示例。

作爲Daniel explained,這是不可能通過泛型。

一個潛在的選擇是使用T4 Templates。根據您的需要,您可以在編譯時根據模板生成類,這聽起來像可能會滿足您的需求。

0

您試圖讓編譯器執行代碼在運行時應該執行的操作。

是的,這在C++中是可能的。在C#中,事實並非如此。你的代碼在C#中的等價物是:

public class Factorial 
{ 
    public static ulong Compute(ulong n) 
    { 
     if (n == 0) 
      return 1; 
     return n * Factorial.Compute(n - 1); 
    } 
} 

需要注意的是,雖然靜態代碼已經是一個壞違反了OOP原則(但有時是必要的),採用基於價值的模板更是雪上加霜。您的類型應該取決於其他類型,這可能使用泛型。他們不應該依賴具體的價值觀。

相關問題