Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重载系统。自定义类型的数学方法_C#_Overloading - Fatal编程技术网

C# 如何重载系统。自定义类型的数学方法

C# 如何重载系统。自定义类型的数学方法,c#,overloading,C#,Overloading,我目前正在处理一些自定义类型的单元我希望其他用户能够使用(sin、cos、ln等)进行数学运算 我想做的是重载System.Math中的数学函数,以Unit作为参数,这样当用户编码时,他们不必使用两个类中不同的静态方法(Math.Sin()和Unit.Sin())在同一表达式中使用双精度和Unit)进行数学运算。我想对任何想使用我的类的人保持简单 如何重载System.Math或者是否有其他方法来实现我的目标?无法重载现有的.net类。 您可以使用Intellij Rider获取System.M

我目前正在处理一些自定义类型的
单元
我希望其他用户能够使用(sin、cos、ln等)进行数学运算

我想做的是重载
System.Math
中的数学函数,以
Unit
作为参数,这样当用户编码时,他们不必使用两个类中不同的静态方法(
Math.Sin()
Unit.Sin()
)在同一表达式中使用双精度和
Unit
)进行数学运算。我想对任何想使用我的类的人保持简单


如何重载
System.Math
或者是否有其他方法来实现我的目标?

无法重载现有的.net类。 您可以使用Intellij Rider获取System.Math的源代码,对所有类使用巨大的ctrl+c并粘贴到自定义数学类中。然后修改每个方法以适合您的单位系统


抱歉,如果我没有给出您期望的答案。

加布里克说得对,您不能让
系统的数学负担过重。另一个解决方案是将
System.Math
完全包装到您自己的类中。由于我假设将double和
Unit
组合的主要问题是
Unit
需要先进行某种形式的转换,因此您将创建一些方法的重载,这些方法将
Unit
作为有效组合中的参数


这看起来可能比简单地重载特定方法需要更多的工作,但是大部分耗时的工作都是相同的,就好像这是可能的一样。剩下的方法(无论如何都不会重载)只需调用
System.Math
上的底层方法即可。您可以通过任意数量的快速代码生成技术生成所有代码。

欢迎使用堆栈溢出。谢谢你的提问

与大多数东西一样,.Net有几种方法可以实现这一点。我会用它

通过使用转换运算符,您的
单元
类型可以转换为其他数据类型

例如,如果要使用a
单位执行Math.Sin,可以创建显式或隐式转换运算符

public struct Unit
{
    private readonly double value;

    public Unit(double value)
    {
        this.value = value;
    }

    public static implicit operator double(Unit d) => d.value;
    public static explicit operator Unit(double b) => new Unit(b);
}
因此,
Math.Sin(double)
现在可以接受一个单位

var unit = new Unit(1d);
var sin = Math.Sin(unit);
Console.WriteLine(sin.ToString(CultureInfo.InvariantCulture));

如果这不能回答您的问题,请告诉我们更多关于
装置的信息。请随意将现有来源粘贴到原始问题中。

您的问题不清楚。您的
Unit.Sin()
方法看起来像什么?为什么它与
Math.Sin()
方法非常相似,以至于您觉得它在使用它的代码中应该是相同的?如果您的
单元
类型委托给
数学
方法本身,您可以使用隐式转换。如果
单元
类型代码与
数学
代码明显不同,则重载
数学
方法将是一个非常糟糕的主意,即使这是可能的(事实并非如此)。请澄清问题,包括提供一份能准确显示您想要做什么的报告。这是正确的方法。将类型(
Unit
)设计为基本类型,并允许与现有数字类型进行隐式转换。