加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用泛型获取C#中数组的元素总和

发布时间:2020-12-15 20:04:35 所属栏目:百科 来源:网络整理
导读:我想编写一个方法,它可以采用数值类型的任意数组,并返回startIndex和endIndex之间所有元素的总和.这就是我所拥有的: private static T SumArrayRangeT(T[] scores,int startIndex,int endIndex){ T score = 0; for (int i = startIndex; i = endIndex; i++)
我想编写一个方法,它可以采用数值类型的任意数组,并返回startIndex和endIndex之间所有元素的总和.这就是我所拥有的:

private static T SumArrayRange<T>(T[] scores,int startIndex,int endIndex)
{
    T score = 0;
    for (int i = startIndex; i <= endIndex; i++)
    {
        score += scores[i];
    }
    return score;
}

但编译因这两个错误而失败.

>无法隐式转换类型’int’
到’T’.
>操作符’=’不能
适用于’T’和’T’类型的操作数
‘T’

有什么方法可以强制T只是其中一种数字类型(长,双等)?或者他们是一个更优雅的解决方法?

解决方法

不,没有办法限制泛型类型参数来使用运算符,也没有很好的解决方法.一个合适的接口是诸如INumeric或IArithmetic之类的接口,其中包括Add,Subtract等方法,它们由所有原始类型(如int和long)实现. MS Connect中有一个 5-year old feature request for that,仍处于活动状态.最新消息是:

Unfortunately,we’ve had to cut our plans to solve this problem in the .NET Framework 4.0.

在那之前,你将被降级为:

>自己使用反射 – 凌乱而且非常慢
>使用将为您使用Reflection的任何现有包装器(例如Microsoft.VisualBasic.CompilerServices.Operators类,使用AddObject,SubtractObject等方法,这些方法使用反射并为相应的运算符实现VB语义) – 易于使用,但仍然非常慢>你想要处理的硬编码类型(即不支持用户定义类型上的重载算术运算符),并使用巨型if(x是int)… else if(x是double)… statement.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读