2011-05-02 31 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