泛型约束问题

jxsrleoyan 2013-02-25 11:04:16
/// <summary>
/// 累加数组中所有数字
/// </summary>
/// <typeparam name="T">所有数字类型</typeparam>
/// <param name="a">数组</param>
/// <returns>数字</returns>
public static double Sum<T>(T[] a) where T : sbyte, byte, short, ushort, int, uint, long, ulong, float, double {
double s = 0;
for (int i = 0; i < a.Length; i++) {
s += Double.Parse( a[i].ToString());

}
return s;
}

错误 “sbyte”不是有效的约束。作为约束使用的类型必须是接口、非密封类或类型形参。

我想对这个约束为数字怎么写?
...全文
237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
phommy 2013-02-25
  • 打赏
  • 举报
回复
属于重复制造车轮问题。。建议直接用系统的sum var sum = arr.Sum(m => (double)m);
空格键 2013-02-25
  • 打赏
  • 举报
回复
约束 说明 T:结构 类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可以为 null 的类型(C# 编程指南)。 T:类 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。 T:new() 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。 T:<基类名> 类型参数必须是指定的基类或派生自指定的基类。 T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。 T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。
threenewbee 2013-02-25
  • 打赏
  • 举报
回复
引用 11 楼 jxsrleoyan 的回复:
引用 2 楼 phommy 的回复:属于重复制造车轮问题。。建议直接用系统的sum var sum = arr.Sum(m => (double)m); 这不是我的本意。是在练习怎么用C#中的泛型随便写的,与Sum函数本身其实是无关的。 引用 7 楼 caozhy 的回复:泛型约束不能解决所有的问题。这也不怪你,事实上,在弱类型的动态语言中,根本就没有这……
别找了,没有的。不过你可以用 IConvertable,你说的这些都支持 IConvertable
jxsrleoyan 2013-02-25
  • 打赏
  • 举报
回复
引用 2 楼 phommy 的回复:
属于重复制造车轮问题。。建议直接用系统的sum var sum = arr.Sum(m => (double)m);
这不是我的本意。是在练习怎么用C#中的泛型随便写的,与Sum函数本身其实是无关的。
引用 7 楼 caozhy 的回复:
泛型约束不能解决所有的问题。这也不怪你,事实上,在弱类型的动态语言中,根本就没有这些问题,所以不要和我说什么语言有不同,思路都一样。如果你的思维方式和C#能做的不相符,换一个语言可能更好。
呵呵,你说到了一点点,我是在找C#中有没有Java的Number抽象类
threenewbee 2013-02-25
  • 打赏
  • 举报
回复
引用 9 楼 phommy 的回复:
现在想想 如果微软定义 IAddable 接口、把+操作符定义进接口,楼主的问题就容易了。 显然这种情况下,系统类int double string之类的都应实现IAddable,楼主只要做where IAddable就行了。微软偷懒了--- 当然如果不偷懒,还有一堆ITimable之类的要实现。。
从语法的角度看,无法解决这样的问题,你说的这些就好比托勒密学派的古典天文学家解释不了天体运动的“误差”,而人为给行星轨道加上小圈,以及小圈上再加小圈,永远无法真正解决问题。而正确之道是哥白尼的日心说。
phommy 2013-02-25
  • 打赏
  • 举报
回复
现在想想 如果微软定义 IAddable 接口、把+操作符定义进接口,楼主的问题就容易了。 显然这种情况下,系统类int double string之类的都应实现IAddable,楼主只要做where IAddable就行了。微软偷懒了--- 当然如果不偷懒,还有一堆ITimable之类的要实现。。
  • 打赏
  • 举报
回复
public static double Sum<T>(T[] a) where T : struct { double s = 0; for (int i = 0; i < a.Length; i++) { ValueType value = a[i] as ValueType; if (value != null && (value is Byte || value is Int16 || value is Int32 || value is Int64 || value is SByte || value is UInt16 || value is UInt32 || value is UInt64 || value is Decimal || value is Double || value is Single)) { s += Double.Parse(a[i].ToString()); } } return s; }
threenewbee 2013-02-25
  • 打赏
  • 举报
回复
泛型约束不能解决所有的问题。这也不怪你,事实上,在弱类型的动态语言中,根本就没有这些问题,所以不要和我说什么语言有不同,思路都一样。如果你的思维方式和C#能做的不相符,换一个语言可能更好。
  • 打赏
  • 举报
回复
引用 4 楼 dalmeeme 的回复:
约束不能指定为int、double这种,按你的需求,只能写成 public static double Sum<T>(T[] a) where T : struct
这个是对的。
catchdream 2013-02-25
  • 打赏
  • 举报
回复
引用 4 楼 dalmeeme 的回复:
约束不能指定为int、double这种,按你的需求,只能写成 public static double Sum<T>(T[] a) where T : struct
+1
dalmeeme 2013-02-25
  • 打赏
  • 举报
回复
约束不能指定为int、double这种,按你的需求,只能写成 public static double Sum<T>(T[] a) where T : struct
angel6709 2013-02-25
  • 打赏
  • 举报
回复
Sum<T>(T[] a) where T : sbyte, byte, short, ushort, int, uint, long, ulong, float, double 多继承了

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧