C# 有没有办法重载自定义类型的数学函数?

C# 有没有办法重载自定义类型的数学函数?,c#,.net,operator-overloading,C#,.net,Operator Overloading,我知道可以对自定义类型执行运算符重载(+-*/)。对于自定义数学函数也有同样的方法吗?这将使向量操作更自然(如R中)。例如: vector = [1, 2, 3, 4, 5] vector + vector = [2, 4, 6, 8, 10] # can be achieved with operator overloading vector * 5 = [5, 10, 15, 20, 25] # can be achieved with operator overloading pow

我知道可以对自定义类型执行运算符重载(+-*/)。对于自定义数学函数也有同样的方法吗?这将使向量操作更自然(如R中)。例如:

vector = [1, 2, 3, 4, 5]

vector + vector = [2, 4, 6, 8, 10]  # can be achieved with operator overloading
vector * 5 = [5, 10, 15, 20, 25] # can be achieved with operator overloading

pow(vector, 2) = [ 1, 4, 9, 16, 25 ]  # is it possible in C#?
更新
从下面的答案中,我看到“函数重载”是不可能的(可能没有多大意义),最好的处理方法是创建自定义数学函数库(静态类)。
这个解决方案很好,不过有没有办法将“自定义函数”与其他自定义类型一起重用?假设我有数字(int/float)、复数、向量和矩阵(向量数组)。我希望我的Pow函数能够处理所有4种类型(它应该为对象中的每个数字元素供电)。
此外,是否有一种方法可以让函数根据输入类型执行不同的操作?比如说

abs(-1) = 1  # for integer abs just change the sign if negative
abs(4+3i) = sqrt(4^2+3^2) = 5 # smth different for complex number

您可以为数组类创建扩展方法pow()

 public static class VecorExtension
{
        public static void pow(this Array vector, int i)
        {
            ...
        }
}
用法:

[1,2,3].pow(2)


您可以为数组类创建扩展方法pow()

 public static class VecorExtension
{
        public static void pow(this Array vector, int i)
        {
            ...
        }
}
用法:

[1,2,3].pow(2)


您可以通过使用C#6中添加的
使用static
功能来实现类似的功能。这允许您使类中的静态方法可用,而无需指定类型名称。(经常引用.NET
Math
类作为此功能的首选。)

假设一个
Vector
类实现了
IEnumerable
,您可以创建一个包含静态
Pow
函数的类:

namespace Vectors
{
    public static class VectorMath
    {
        public static Vector Pow(Vector v, int exponent)
        {
            return new Vector(v.Select(n => Math.Pow(n, exponent)));
        }
    }
}
然后,在要使用该类的任何代码文件中,包括该语句

using static Vectors.VectorMath;
这将允许您调用
Pow
方法,而无需指定它是
VectorMath
类的成员:

class Program
{
    static void Main(string[] args)
    {
        Vector v = new Vector { 1, 2, 3 };
        Vector squares = Pow(v, 2);

        // Squares now contains [1, 4, 9]
    }
}

您可以通过使用C#6中添加的
usingstatic
功能来实现类似的功能。这允许您使类中的静态方法可用,而无需指定类型名称。(经常引用.NET
Math
类作为此功能的首选。)

假设一个
Vector
类实现了
IEnumerable
,您可以创建一个包含静态
Pow
函数的类:

namespace Vectors
{
    public static class VectorMath
    {
        public static Vector Pow(Vector v, int exponent)
        {
            return new Vector(v.Select(n => Math.Pow(n, exponent)));
        }
    }
}
然后,在要使用该类的任何代码文件中,包括该语句

using static Vectors.VectorMath;
这将允许您调用
Pow
方法,而无需指定它是
VectorMath
类的成员:

class Program
{
    static void Main(string[] args)
    {
        Vector v = new Vector { 1, 2, 3 };
        Vector squares = Pow(v, 2);

        // Squares now contains [1, 4, 9]
    }
}

您只需编写自己的
pow
方法。这不能满足您的需要吗?或者您可以重载
^
操作符,但这可能会带来一些混乱。不,这只是伪代码。假设我有一个处理整数/浮点数的标准数学库,想知道是否有一种方法可以将它与vector type.pow一起重用,这只是一个例子。我想将它与其他函数一起使用,比如sin、cos、sqrt等。您只需编写自己的
pow
方法。这不能满足您的需要吗?或者您可以重载
^
操作符,但这可能会带来一些混乱。不,这只是伪代码。假设我有一个处理整数/浮点数的标准数学库,想知道是否有一种方法可以将它与vector type.pow一起重用,这只是一个例子。我想将它与其他函数(如sin、cos、sqrt、etcI)一起使用。我担心这会将扩展方法添加到所有可能非常反直观的
Array
类型,更不用说实现的复杂性。我担心这会将扩展方法添加到所有可能非常反直观的
Array
类型,更不用说实现的复杂性了。听起来是个不错的解决方案,至少方法是从向量类中分离出来的(我认为这是我的主要需求)。理想情况下,我希望让所有数学函数(或自定义函数集)一次性使用向量类型(而不是为每个函数创建包装器)。这可能是不可能的,只是想确保我没有错过一些魔法trick@MikeTwc不幸的是,这是不可能的,数学在C#中超越了泛型的能力。您可以在LINQ中看到这一点,例如,在LINQ中,所有数字类型及其可为空的变量都有重载。您可能能够提取一些常见的语义,但如果您最后考虑一下,像
Pow
这样的函数具有特定于类型的实现(通常是平台的指令集),因此在框架级别提供通用软件实现没有多大意义。听起来是个不错的解决方案,至少方法是从vector类中分离出来的(我认为这是我的主要需求)。理想情况下,我希望让所有数学函数(或自定义函数集)一次性使用向量类型(而不是为每个函数创建包装器)。这可能是不可能的,只是想确保我没有错过一些魔法trick@MikeTwc不幸的是,这是不可能的,数学在C#中超越了泛型的能力。您可以在LINQ中看到这一点,例如,在LINQ中,所有数字类型及其可为空的变量都有重载。您可能能够提取一些常见的语义,但如果您最后考虑一下,像
Pow
这样的函数具有特定于类型的实现(通常是平台的指令集),因此在框架级别提供通用软件实现没有多大意义。