Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';这个密码怎么了?无法将带[]的索引应用于类型为的表达式_C# - Fatal编程技术网

C# 什么';这个密码怎么了?无法将带[]的索引应用于类型为的表达式

C# 什么';这个密码怎么了?无法将带[]的索引应用于类型为的表达式,c#,C#,我正在写一个小的控制台应用程序。我不知道怎么了 namespace Mtrx { class Mtrx { private double[,] _sqMtrx; private double _mtrxSize { get; set; } public Mtrx(int i) { if (i <= 0) throw new FormatExceptio

我正在写一个小的控制台应用程序。我不知道怎么了

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
{
私人双[,]_sqMtrx;
专用双精度_mtrxSize{get;set;}
公共Mtrx(国际一级)
{

如果(i是的,问题是:

return m1[i, j] == m1[i, j] + m2[i, j];
这在各方面都是错误的:

  • 当操作员打算返回一个
    Mtrx
    时,您正试图返回一个
    bool
    (顺便说一句,这是一个可怕的名字-包含元音!)
  • 您试图在
    m1
    m2
    上使用索引器,这是类型为
    Mtrx
    的变量。您尚未创建索引器。您需要使用
    m1.\u sqMtrx[i,j]
    等,或者需要声明索引器,例如:

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


基本上,我认为您应该重新考虑整个操作符。

您正在尝试像数组一样访问对象,而不是访问对象内部的数组。请尝试
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;
        }
    }
公共静态Mtrx操作员+(Mtrx m1、Mtrx m2)
{
如果(m1.\u mtrxSize==m2.\u mtrxSize)
{
var outVal=新Mtrx(m1.\u mtrxSize)

对于(int i=1;我侧边注意到您的
Matrix
类似乎缺少一些字母…nt sr wh d tht。不要将您的类命名为与其命名空间相同的名称。接受另一个
Mtrx
对象的Add方法可能会更好,或者至少更容易理解。@RobertHarvey:不,因为这可能会改变现有的矩阵。(或者它的名字会很糟糕——就像BCL中的许多方法一样。)有一个操作符来创建一个新的矩阵是比较干净的,IMO-但是OP需要重新访问代码才能实现这一点。好吧,让它成为一个
静态
方法,传入两个
Mtrx
对象,然后返回一个添加的
Mtrx
@RobertHarvey:好的……那么,为什么在这一点上,作为一个方法比作为一个方法更好呢运算符?从根本上说,它是一个运算符这一事实是这段代码中问题最小的部分。我想,甚至名称空间名称的选择也比这个决定更糟糕。@JonSkeet Deck chairs on the titanic?@RobertHarvey:这不是问题-代码在同一个类中。是的,但您正在解引用传入的矩阵对象,而不是accessing内部成员。@RobertHarvey:那么?它是完全有效的C#。C#中的可见性是由代码可以访问成员的位置定义的-在
Mtrx
类的主体中声明的任何代码都可以在任何实例上使用
Mtrx
的任何私有成员。您的意思是说,您可以访问传入对象的私有成员,只要它是您使用的是同一个类定义?听起来很混乱。@RobertHarvey:Java和C#都是这样工作的,而且一直都是这样。在我看来,这是完全合理的。(否则,所有事情都会更加困难,否则实现细节将不得不毫无理由地泄漏。)我得到了:与“Mtrxy.Mtrx.Mtrx(int)”匹配的最佳重载方法'有一些无效参数您的变量大小应该是int而不是doubkle。
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;
        }
    }
}