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
)设计为基本类型,并允许与现有数字类型进行隐式转换。