假设我有一个像这样的扩展方法
public static IEnumerable<int> DoThings(this int n)
{
var mList = new List<int> { 2, 3, 4, 5 };
var result = new List<int>();
foreach(var m in mList)
result.Add(n * m);
return result;
}
是否有一种“泛化”的方法,以便我也可以在long
上使用它并因此获得IEnumerable<long>
?
如果我简单地使用public static IEnumerable<T> DoThings<T>(this T n)
,则很难在不以Cast <>和Convert vortex结尾的情况下进行数学运算
答案 0 :(得分:-3)
没有通用约束仅适用于Int32
(即int
)和Int64
(即long
),而不是< / em>适合任何其他数字类型。
但是,您只能创建两个扩展方法,其中一个引用另一个:
public static IEnumerable<int> DoThings(this int n)
{
return DoThings((long) n).Cast<int>();
}
public static IEnumerable<long> DoThings(this long n)
{
var mList = new List<int> { 2, 3, 4, 5 };
var result = new List<long>();
foreach(var m in mList)
result.Add(n * m);
return result;
}
请注意,结果也可能超出Int32
的最大数量,在这种情况下,调用InvalidCastException
版本时会得到int
。
尽管无论如何都可以将int
隐式地转换为long
,但我什至不明白为什么您甚至想要两种方法。继续使用long
,而完全不用担心int
版本。