C# 泛型方法:返回double或double-like类

C# 泛型方法:返回double或double-like类,c#,operator-overloading,generic-method,C#,Operator Overloading,Generic Method,我目前正在用C#中的运算符重载实现一个简单版本的算法微分。我试图找出如何设计通用的数学函数来处理普通的double和我自己的类“ADouble”,它像double一样工作,但重载了算术运算符,如+,*,-等等 例如,我想创建一个函数,如 Public T MathFunction<T>(T x) where T : "is either double or Adouble" { if (x > 0) return new T(1.0) else

我目前正在用C#中的运算符重载实现一个简单版本的算法微分。我试图找出如何设计通用的数学函数来处理普通的double和我自己的类“ADouble”,它像double一样工作,但重载了算术运算符,如+,*,-等等

例如,我想创建一个函数,如

Public T MathFunction<T>(T x) where T : "is either double or Adouble"
{
    if (x > 0)
         return new T(1.0)
    else
        // something
}
但是doubles显然没有这样的构造函数。我试过不同的方法。首先我想到的是

Public T MathFunction<T>(T x) where T : "is either double or Adouble"
{
     T temporaryVar = 2*x;
     // .. More calculations
     return "some T";
}
if (typeof(T) == typeof(ADouble)
    return new ADouble(1.0)
但这不起作用,因为函数不能显式地将ADouble转换为T(我理解)

有人对我如何实现适用于我的ADouble类和Double类的通用计算函数有什么建议吗?或者是创建具有不同签名的多个方法的唯一选项?对设计的不同建议也非常感谢

或者是创建具有不同签名的多个方法的唯一选项

称为“方法重载”

对。这是表示“类型A或类型B”约束的正确方法,尤其是因为即使您可以成功地将其表示为泛型约束,您仍然面临调用适当构造函数的挑战

在C#泛型中没有一种机制可以让语句
返回新的T(1.0)成功编译。这样做需要一些语法来额外地将类型限制为那些具有类型为
double
的单个参数的构造函数,而C#中没有这样的特性

这不起作用,因为函数不能显式地将ADouble强制转换为T

实际上,这是因为它不能隐式地强制转换。但是,距离足够近。:)

这将是你必须克服的下一个障碍。讽刺的是,这是最简单的。问题是,在编写表达式时,编译器对所发生的事情了解得足够多,因此无法保证强制转换会成功。但是,如果您首先将值强制转换为
对象
,则可以在编译器不抱怨的情况下将其强制转换为
T

提醒你,我不是建议你那样做。这里真正的问题是,您正试图使用泛型语法来处理真正非泛型的内容。泛型代码用于您可以使用任何类型,或者至少是广泛约束类型的地方。如果您考虑了特定类型,特别是如果每个特定类型的实现不同,那么您不应该使用泛型

在这种情况下,方法重载更合适


旁白:假设您的<代码> Adabule<代码>类型与“代码>双< /代码>等价,可以实现转换而不丢失任何数据,您应该考虑编写隐式转换,以帮助类型互换。看起来是这样的:

然后,您可以使用简单的赋值来初始化
ADouble
值,如:


AFAIK您不能在泛型约束中使用
x或y
。您可以使用
动态
参数创建一个方法,并在内部测试它是否为
,如果不抛出无效参数异常,则可以使用
类型实现的接口,例如
IConvertible
IComparable
,或
IEquatable
。另一种选择是构建。感谢您的详细解释。特别是最后一部分。这很有帮助。我最后做的是实现我所有的ADouble数学方法,然后生成一个重载版本,返回一个double并将其作为输入double,然后使用隐式转换方法调用该方法的ADouble版本。现在这个很好用。
if (typeof(T) == typeof(ADouble)
    return new ADouble(1.0)
public static implicit operator ADouble(double value)
{
    return new ADouble(value);
}
ADouble adouble = 1.0;