我假设您想编写这样的通用方法Sum
:
static T Sum<T>(this IEnumerable<T> values) where T : ??
{
T result = 0;
foreach (var value in values)
{
result = result + value;
}
return result;
}
不幸的是,没有任何约束可以代替??
来完成这项工作。
.NET 中内置的数据类型实现了某些接口。例如,int实现 IComparable、IFormattable、IConvertible、IComparable<int> 和 IEquatable<int>。这些都没有提供允许您实现方法的Add
方法(或运算符) 。而且您不能将接口实现添加到现有类型。+
Sum
您可以做的是将一个对象传递给Sum
知道如何添加两个泛型类型值的方法:
static T Sum<T>(this IEnumerable<T> values, IAdder<T> adder)
{
T result = adder.Zero;
foreach (var value in values)
{
result = adder.Add(result, value);
}
return result;
}
和
interface IAdder<T>
{
T Zero { get; }
T Add(T a, T b);
}
和
class Int32Adder : IAdder<Int32>
{
public static readonly Instance = new Int32Adder();
public int Zero { get { return 0; } }
public int Add(int a, int b) { return a + b; }
}