2015-05-30 106 views
0

概括地說,我試圖讓這段代碼的工作:轉換爲普通

class it<X> 
{ 
    X[] data; 
    int pos; 

    public Y get<Y>() 
    { 
     return (Y) data[pos]; 
    } 
} 

基本上,我有很多不同的基本類型數組,需要處理的另一個地方是不同的圖元。前面的代碼不會編譯,因爲編譯器不知道X和Y是什麼。下面,確實,但是:

public Y get<Y>() 
    { 
     return (Y) (object) data[pos]; 
    } 

然而,然後我得到的運行時異常,如:

InvalidCastException: Cannot cast from source type to destination type. 
it[System.Double].get[Single]() 

這似乎愚蠢的,因爲C#顯然有花車和雙打(與其他原語)之間的轉換。我猜它與拳擊等有關,但我對C#很陌生,所以我不知道 - 我想我已經習慣了C++模板。請注意,X和Y之間的轉換總是存在 - 我可以通過某種方式告訴編譯器嗎?

+1

我知道這是一個很好的例子,但您應該嘗試遵循[C#命名指南](https://msdn.microsoft.com/en-us/library/xzf533w0%28v=vs.71%29。 ASPX)。 '得到'應該是'Get','它'應該是'It '。也不是命名指導的一部分,但在我個人看來私人領域應該在'_'之前加上'_data'和'_pos',所以你可以告訴他們除了方法參數之外。 –

+0

感謝您的輸入。儘管一如既往,大型項目中的人員和代碼之間的一致性往往是首選。 – Shaggi

回答

1

你可以使用ConvertChangeType - 方法:

public Y get<Y>() 
{ 
    return (Y)Convert.ChangeType(data[pos], typeof(Y)); 
} 

它也可能是一個好主意,添加一些generic constraints到您的類和方法,以確保只有原語可以傳遞:

class it<X> where X : struct 

public Y get<Y>() where Y : struct