2011-05-02 110 views
4

我有一個泛型類(C#),C#轉換噸至長

class MyClass<T> where T : struct, IComparable<T> 
{ 
    public T filelocation; 
} 

T可以是任何UInt32的或UINT64(沒有別的)。

我需要filelocation轉換爲長期尋求在文件中...

我曾嘗試以下

long loc = (T)myclass.filelocation; 

long loc = (T)(object)myclass.filelocation; 

但似乎沒有任何工作...

任何想法?

+7

長期回報可能濫用或濫用泛型。泛型被認爲是* generic *。爲什麼不只是有一個非泛型類需要ulong? uint會自動轉換爲ulong。 – 2011-05-02 14:02:06

+0

我正在使用PST文件格式。它有兩種格式,ANSI(UInt32)和UNICODE(UInt64)。我這樣做(有希望)減少代碼複製 – 2011-05-02 20:40:54

+0

@Eric:我走了你的路線。我重寫它不是通用的。 – 2011-05-06 00:26:23

回答

11

致電Convert.ToInt64

書寫(object)fileLocation創建了盒裝UInt32
Boxed value types can only be unboxed to their original value types,所以你不能在一步到達long
您可以編寫(long)(ulong)fileLocation,但由於相同的原因,該功能會因uint而失敗。

+0

同樣對於這個類應該有一個'IConvertible'約束條件 – BrokenGlass 2011-05-02 13:20:59

+0

@Broken:No; 'Convert.ToInt64'接受一個'object'。但是,你是對的;它應該有這個約束。 – SLaks 2011-05-02 13:27:24

+0

我最終重寫了一切,不是通用的。因爲T只能是兩個值之一,所以我在那裏放置了一些if語句,它們在哪裏重要......但這是我重寫前的路線。 – 2011-05-06 00:25:12

1

您可以使用的TryParse:

long lng; 
int testNum = 55; 
long.TryParse(testNum.ToString(),out lng); 
+2

['long.TryParse'](http://msdn.microsoft.com/en-us/library/zc2x2b1h.aspx)需要一個字符串作爲輸入參數,而不是'UInt32'或'UInt64',即它贏得了'編譯! – 2011-05-02 13:20:39

+1

只需在此答案中添加一個tostring使其正確。 – 2012-09-07 11:51:20

0

與類定義,如果我喜歡寫東西

public MyClass<long> myclass = new MyClass<long>(); 
    public long returnLong() 
      { 
       return myclass.filelocation; 
      } 

myclass.fileLocation如果你有一個泛型類/方法,該方法只需要UINT或ULONG那麼你是通過defult

+1

是的,但'T'不是'long'。 – SLaks 2011-05-02 13:18:34