二元运算符的其中一个参数必须是包含类型c#

时间:2016-07-02 09:43:50

标签: c# .net visual-studio-2010 visual-c#-express-2010

public static int[,] operator *(int[,] arr1, int[,] arr2)
    {
        int sum;
        int[,] res = new int[arr1.GetLength(0), arr2.GetLength(1)];
        for (int i = 0; i < arr1.GetLength(0); i++)
        {
            for (int j = 0; j < arr2.GetLength(1); j++)
            {
                sum = 0;
                for (int k = 0; k < arr1.GetLength(1); k++)
                {
                    sum = sum + (arr1[i, k] * arr2[k, j]);
                }
                res[i, j] = sum;
                //Console.Write("{0} ", res[i, j]);
            }
            //Console.WriteLine();
        }

        return res;
    }

这里我试图重载*运算符以乘以两个矩阵。 但编译器继续向我显示错误..

“二元运算符的一个参数必须是包含类型c#”

请告诉我我的代码中有什么问题以及如何解决它。

1 个答案:

答案 0 :(得分:6)

编译器已经告诉你出了什么问题 - 但引用了C#5规范的第7.3.2节:

  

用户定义的运算符声明始终要求至少有一个参数属于包含运算符声明的类或结构类型。因此,用户定义的运算符不可能具有与预定义运算符相同的签名。

换句话说,可以:

@FXML private Label label;

...因为那时第二个操作数是声明类型。但在你的情况下,两个操作数都是class Foo { public static int[,] operator *(int[,] arr1, Foo arr2) { ... } }

可以做的是添加扩展方法:

int[,]

然后你可以:

public static class ArrayExtensions
{
    public static int[,] Times(this int[,] arr1, int[,] arr2)
    {
        ...
    }
}

另一个解决方案 - 一个更好的解决方案,IMO,就是声明你自己的int[,] x = ...; int[,] y = ...; int[,] z = x.Times(y); 类来封装矩阵运算。然后你可以定义你自己的乘法运算符:

Matrix

...并且您不会干扰那些不打算被视为矩阵的public static Matrix operator *(Matrix left, Matrix right) 数组。