这段代码有什么问题?不能用[]对类型的表达式应用索引

本文关键字:类型 索引 应用 表达式 不能 段代码 代码 问题 什么 | 更新日期: 2023-09-27 18:07:21

我正在编写一个小型控制台应用程序。我不知道哪里出错了…

namespace Mtrx
{
    class Mtrx
    {
        private double[,] _sqMtrx;
        private double _mtrxSize { get; set; }
        public Mtrx(int i)
        {
            if (i <= 0)
                throw new FormatException();
            else
                this._sqMtrx = new double[i, i];
            _mtrxSize = i;
        }
        public static Mtrx operator +(Mtrx m1, Mtrx m2)
        {
            if (m1._mtrxSize == m2._mtrxSize)
            {
                for (int i = 1; i <= m1._mtrxSize; i++)
                {
                    for (int j = 1; j <= m1._mtrxSize; j++)
                    {
                        return m1[i, j] == m1[i, j] + m2[i, j];
                    }
                }
            }
        }
    }
}

得到:不能使用[]对类型'Mtrx '的表达式应用索引。Mtrx '

这段代码有什么问题?不能用[]对类型的表达式应用索引

问题就在这里:

return m1[i, j] == m1[i, j] + m2[i, j];

这在各个方面都是错误的:

  • 当操作符打算返回Mtrx时,您试图返回bool(顺便说一下,可怕的名字-包含元音!)
  • 您正在尝试使用m1m2上的索引器,这是Mtrx类型的变量。您还没有创建索引器。您需要使用m1._sqMtrx[i, j]等,或者您需要声明一个索引器,例如:

    public double this[int i, int j]
    {
        return _sqMtrx[i, j];
    }
    
  • 如果两个参数大小不同,你的方法不会返回任何东西

从根本上说,我认为你应该重新考虑整个运算符

您试图像访问数组一样访问您的对象,而不是访问对象内部的数组。try m1._sqMatrix[i,j]

嵌套for循环中最内层的行不应该引用数组,而不是mr1, mr2变量吗?

    public static Mtrx operator +(Mtrx m1, Mtrx m2)
    {
        if (m1._mtrxSize == m2._mtrxSize)
        {
            var outVal = new Mtrx(m1._mtrxSize)
            for (int i = 1; i <= m1._mtrxSize; i++)
                for (int j = 1; j <= m1._mtrxSize; j++)
                    outVal._sqMtrx[i,j] = m1._sqMtrx[i, j] + m2._sqMtrx[i, j];
            return outVal;
        }
    }

如果你想对类本身使用索引语法,那么你必须添加一个索引器....

class Mtrx
{
    private double[,] _sqMtrx;
    private int _mtrxSize { get; set; }
    public Mtrx(int i)
    {
        if (i <= 0)
            throw new FormatException();
        else
            this._sqMtrx = new double[i, i];
        _mtrxSize = i;
    }
    public double this[int i, int j]
    {  
        get { return _sqMtrx[i, j]; }
        set { _sqMtrx[i, j] = value; }
    }
    public static Mtrx operator +(Mtrx m1, Mtrx m2)
    {
        if (m1._mtrxSize == m2._mtrxSize)
        {
            var outVal = new Mtrx(m1._mtrxSize)
            for (int i = 1; i <= m1._mtrxSize; i++)
                for (int j = 1; j <= m1._mtrxSize; j++)
                    outVal[i,j] = m1[i, j] + m2[i, j];
            return outVal;
        }
    }
}