【发布时间】:2009-12-31 21:14:48
【问题描述】:
在执行 OO 设计时,将使用简单值类型的方法集合合并到一个泛型方法中会更好吗?例如:
public int Sum(int x, int y)
// Overload with float.
public float Sum(float x, float y)
合并到:
public T Sum<T> (T x, T y)
谢谢,
斯科特
【问题讨论】:
在执行 OO 设计时,将使用简单值类型的方法集合合并到一个泛型方法中会更好吗?例如:
public int Sum(int x, int y)
// Overload with float.
public float Sum(float x, float y)
合并到:
public T Sum<T> (T x, T y)
谢谢,
斯科特
【问题讨论】:
通常是的,但是,特别是对于您的示例(将两个参数相加)-您不能使用泛型来做到这一点,因为 + 运算符不是您可以限制泛型类型参数的任何接口的一部分: )
(注意:这是我的 C# 部分,用其他语言可能仍然可行)
【讨论】:
INumeric,它将包括那些运算符,(适用于实现它们的所有核心类型 - int、uint、float、decimal 等。 )
在某些情况下,是的(并非总是如此);尽管有相反的谣言,但这是可能的。我为"MiscUtil"(免费等)编写了一些代码,完全做到了这一点,并且适用于具有合适运算符的所有类型(甚至是您自己的结构和类,或Nullable<T> 等)。
这里的问题是没有支持Add 等的接口,所以在dynamic 出现之前(在4.0 中)这很棘手;但可以做到 - 这是usage page,带有简化版Sum(“MiscUtil”中的实际代码稍微复杂一些):
public static T Sum<T>(this IEnumerable<T> source)
{
T sum = Operator<T>.Zero;
foreach (T value in source)
{
if (value != null)
{
sum = Operator.Add(sum, value);
}
}
return sum;
}
再一次,在 4.0 中,dynamic 中的很多内容相对简单,因为它支持运算符;但是,上次我对其进行基准测试时,dynamic 比我(ab)使用 Expression 慢。
顺便说一句,标准 LINQ 可以提供Min / Max 的原因是因为IComparable/IComparable<T> 有Comparer<T>.Default 的协助。
【讨论】: