none
【C#】仍然是关于DataTable.Compute()的返回类型的疑问 RRS feed

  • 问题

  • C#2.0
    请看:

    DataTable dt = new DataTable();
    dt.Columns.Add("col1",typeof(int)); //列是int型
    dt.Rows.Add(1);
    dt.Rows.Add(2);

    object o = dt.Compute("sum(col1)", null);  //对列进行一下汇总
    Console.WriteLine(o.GetType().ToString()); //输出System.Int64

    原本int列,汇总结果却是long,导致(int)o这样的转换抛异常。总之现在感觉DataTable.Compute()的返回类型让我捉摸不定,请问有没有权威的文档详解这方面的知识的?


    • 已编辑 ahdung_AI 2012年11月14日 11:12
    2012年11月14日 11:11

答案

  • 这个目前没有官方文档说明,但是通过测试可以发现,它总是返回一个大的类型, 比如你设定列为float,但计算结果为single,这样做也可以防止结果异常。

    就以你的sum为例,一个较大的int32 值和一个较大的int32值相加,结果可能就比int32更大,对于这样的结果,要么溢出,要么用int64表示,你如果要问要是两个int64相加也超出范围咋办?没办法,暂时还没有int128,所以就溢出处理了。


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 ahdung_AI 2012年11月17日 1:31
    2012年11月15日 11:10
    版主

全部回复

  • 这个目前没有官方文档说明,但是通过测试可以发现,它总是返回一个大的类型, 比如你设定列为float,但计算结果为single,这样做也可以防止结果异常。

    就以你的sum为例,一个较大的int32 值和一个较大的int32值相加,结果可能就比int32更大,对于这样的结果,要么溢出,要么用int64表示,你如果要问要是两个int64相加也超出范围咋办?没办法,暂时还没有int128,所以就溢出处理了。


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 ahdung_AI 2012年11月17日 1:31
    2012年11月15日 11:10
    版主
  • 看来只能摸索着来了,谢谢Feng兄
    2012年11月17日 1:34