检查类型T的C#接口有一个运算符/一种检查类型T是否有运算符的方法

时间:2014-07-11 21:31:40

标签: c# interface

interface IMathable
{
    public static IMathable operator +(IMathable l, IMathable r);
    public static IMathable operator -(IMathable l, IMathable r);
}

这样可能吗?我有一系列的数学课。 Vector2 / 3/4/5/6 Matrix3x3 / 4x4 / 5x5 / 6x6等。

他们没有共同的课程,他们开车。但它们都有+ - * /

之类的运算符

我希望有一个类似的课程。

class MyClass <T> where T : IMathable
{
    T magnitude_required_to_reach_toHere;

    public MyClass (IMathable from, IMathable toHere)
        {
            magnitude_required_to_reach_toHere = from + toHere;
        }
}

有没有办法实现这个目标?我被建议让所有的数学课都从抽象课开始,但我不能为所有这些数学课提供抽象课,因为它们是内置的,是图书馆的一部分;我无法修复代码。

1 个答案:

答案 0 :(得分:1)

据我所知,您无法在界面上定义运算符。

但是运营商或多或少都是语法糖。

您可以定义:

interface IMathable {

    IMathable add (IMathable other);
    IMathable sub (IMathable other);

}

实际上,运算符或多或少是一种方法,但是该方法的标识符(+-)以及编译器维护符号表的位置,并找出适当的运算符本身


修改:您提出的要求是不可能的。特别是因为IMathable无法知道假定的返回类型应该是什么。

然而,通过使用一些函数式编程可以解决它的某种解决方法:

class MyClass <T> {

    T magnitude_required_to_reach_toHere;

    public MyClass (T from, T toHere, Func<T,T,T> addfunction) {
            magnitude_required_to_reach_toHere = addFunction(from,toHere);
        }
}

因此,您传递一个函数作为参数,该函数必须具有如何解决问题的计算知识。例如,如果T是一个整数:

 MyClass<int> mc = new MyClass<int>(5,7,(x,y) => x+y);