是否可以为Int32和Int64创建扩展方法?

时间:2018-06-21 14:59:57

标签: c# extension-methods

假设我有一个像这样的扩展方法

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结尾的情况下进行数学运算

1 个答案:

答案 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版本。