6

嗨,我想上课:

class Matrix <T>
    where T : // I don't know what to write here
{
    T[][] elements;
}

我希望 T 可以被 + 和 * 运算符相加和相乘

4

4 回答 4

2

我强烈建议您查看 Messrs Skeet 和 Gravell 的“MiscUtil”库:

http://www.yoda.arachsys.com/csharp/miscutil/

其中包含一个令人难以置信的“通用数学运算符”实现,它应该与您创建通用矩阵数学类的尝试很好地对齐。它实际上让我(有点)想起了 python 以及它如何处理直接引用运算符函数。

(除了@jon-skeet:这有没有机会进入 Nuget?)

他们的测试中的一些示例用法:

double sumOperator = 0;
for (int i = 0; i < COUNT; i++)
{
    sumOperator = Operator.Add(sumOperator, rand.NextDouble());
}

int sumOperator = 0;
for (int i = 0; i < COUNT; i++)
{
    sumOperator = Operator.Add(sumOperator, rand.Next(MAXVALUE));
}
于 2013-02-07T19:45:42.227 回答
2

这是不可能的,因为不受约束的泛型类型被假定为 type Object,它没有定义算术运算符。因此,您似乎需要指定一个接口。

但是,原始类型(Int32、Double 等)将算术运算有效地定义为静态方法(实际上编译器对其进行了特殊处理并生成内联代码)并且 C# 中的接口无法定义静态方法(尽管 CLR 的设计实际上允许)。因此,没有用 C# 编写满足支持算术运算要求的接口;即使可以编写,原始类型也不会继承它,所以它仍然无法工作。

最终结果是无法在 C# 中做你想做的事。

如果你尝试它,你会得到一个类似的错误

Operator '+' cannot be applied to operands of type 'T' and 'T'

如果您对此消息进行网络搜索,您会发现关于可能的解决方法的各种讨论。

于 2013-02-07T19:54:23.833 回答
1

可能这种方式会对某人有所帮助。您可以通过在 fabric-library 类中放置 add、multiplicate 函数来改进这一点。

更新 可能会将来自 JerKimball 帖子的操作员放入辅导员

class Matrix <T>
{
    T[][] elements;

    public Matrix(Func<T, T, T> add, Func<T,T,T> multiplicate)
    {
        this.Add = add;
        this.Mult = multiplicate;
    }

    public Matrix<T> operator +(Matrix<T> p1, Matrix<T> p2)
    {
        // correct this
        var t = Add(p1.elements[0][0], p2.elements[0][0]);
        return this;
    }

    public Matrix<T> operator *(Matrix<T> p1, Matrix<T> p2)
    {
        // correct this
        var t = Mult(p1.elements[0][0], p2.elements[0][0]);
        return this;
    }

    private Func<T, T, T> Add { get; set; }

    private Func<T, T, T> Mult { get; set; }
}

static void Main(string[] args)
{
    var m1 = new Matrix<int>((x,y) => x + y, (x,y) => x * y);
    var m2 = new Matrix<int>((x, y) => x + y, (x, y) => x * y);
}

更新 2

只需提供对这样的属性的访问:

    public T[][] Elements { get; set; }

你可以这样做:

m1.Elements[0][0] = 10;
var m3 = new Matrix<int?>((x, y) => x + y, (x, y) => x * y);
m3.Elements[0][0] = null;
于 2013-02-07T19:32:53.203 回答
1

由于我不知道任何内置解决方案,请查看:

public abstract class BaseClass
{
    public static BaseClass operator +(BaseClass p1, BaseClass p2)
    {
        return p1 + p2;
    }

    public static BaseClass operator *(BaseClass p1, BaseClass p2)
    {
        return p1 * p2;
    }
}

public class ChildClass : BaseClass
{
}

public class Matrix <T> where T : BaseClass
{
    T[][] elements;
}

希望这可以帮助。

但是int,不支持其他类型,例如。

于 2013-02-07T19:10:05.913 回答