【问题标题】:C# Convert T to longC# 将 T 转换为 long
【发布时间】:2011-05-02 13:11:19
【问题描述】:

我有一个通用类 (C#),

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

T 可以是 UInt32 或 UInt64(没有别的)。

我需要将文件位置转换为 long 以在文件中查找...

我已经尝试了以下

long loc = (T)myclass.filelocation;

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

但似乎没有任何效果......

有什么想法吗?

【问题讨论】:

  • 如果你有一个只需要 uint 或 ulong 的泛型类/方法,那么你可能在滥用或误用泛型。泛型应该是generic。为什么不只是有一个需要 ulong 的非泛型类? uint 会自动转换为 ulong。
  • 我正在使用 PST 文件格式。它有两种格式,ANSI (UInt32) 和 UNICODE (UInt64)。我这样做是为了(希望)减少代码重复
  • @Eric:我走了你的路。我将其重写为不是通用的。

标签: c# generics types int


【解决方案1】:

致电Convert.ToInt64

编写(object)fileLocation 会创建一个装箱的UInt32
Boxed value types can only be unboxed to their original value types,因此您不能一步将其转换为long
你可以写(long)(ulong)fileLocation,但由于同样的原因,uint 会失败。

【讨论】:

  • 同样对于这个类应该有一个IConvertible约束
  • @Broken:不; Convert.ToInt64 采用 object。但是,您是对的;它应该有那个约束。
  • 我最终将所有内容都重写为不通用。由于 T 只能是两个值之一,因此我在其中放了一些 if 语句,这很重要……但这是我重写之前的路线。
【解决方案2】:

试试Convert.ToInt64

long loc = Convert.ToInt64(myclass.filelocation);

【讨论】:

    【解决方案3】:

    您可以使用 TryParse:

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

    【讨论】:

    • long.TryParse 需要一个字符串作为输入参数,而不是UInt32UInt64,即它不会编译!
    【解决方案4】:

    如果我写类似的东西,你的类定义

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

    myclass.fileLocation 默认返回 long

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-13
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2012-03-08
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多