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;
}
}
}