【问题标题】:Why left-hand side of an assignment must be a variable property or indexer? [closed]为什么赋值的左侧必须是变量属性或索引器? [关闭]
【发布时间】:2017-08-15 10:35:07
【问题描述】:
private ArrayList arr = new ArrayList();

private ArrayList Test()
{
    return arr;
}
private void WhyMustVariable()
{
    Test() = new ArrayList();   // error: left-hand side of an assignment must be a variable property or indexer
}

为什么我不能这样做 Test() = ...; 谢谢。

【问题讨论】:

  • 您的意思是如何将变量传递给方法?你希望你的尝试做什么?
  • Test() 是一个方法,只能给属性和字段赋值; arr = new ArrayList(),或 arr = GetData()。
  • 因为您尝试做的事情毫无意义。你可以给一个变量赋值,但是你不能给一个方法赋值。您期望该代码做什么?
  • 您认为之后您将如何访问新的ArrayList?在Test() 返回时,它的返回值和arr 字段具有no 关系,尽管事实上其中一个复制了另一个。
  • @TangWentian:这是对方法的调用。我真的无法想象为什么你会认为它是一个变量。如果那行代码确实编译了,你希望它做什么?您可以与方法的结果进行交互,您可以将方法的结果(或任何其他值)分配给变量,但您不能 分配 不是的东西 一个变量。

标签: c# .net


【解决方案1】:

在编写test().xyz = xxx 时,您首先执行test,它会顽固地返回ArrayList 的一些实例(顺便说一句。您现在应该考虑改用List<T>,它是强类型的,因此可以避免将每个元素都转换为你的列表到它的实际类型)。现在你当然可以用那个实例做你想做的事,例如调用另一个方法或设置它的任何属性。这相当于这样做:

var val = test();
val.MyMember = 3;

但是,当使用 test() = ... 时,您会为方法的返回值分配一个新值,这显然没有意义。

我想你想要的是提供一些参数给你的方法。为此,您的方法还应该期望一个:

ArrayList test(int myInt)
{
    // do something with myInt
}

然后这样称呼它:

var list = test(3);

【讨论】:

  • 首先,感谢您的回答。正如错误告诉我的那样,左侧的“Test()”不是变量。但是,在我看来,Test() 返回 arr,为什么 Test() 不是变量..
  • @TangWentian 不,这是一个表达式,它的结果可以存储到变量中。
  • @TangWentian - Test() 返回arr。它返回对arr 当前正在引用的同一对象的引用。正如我在 cmets 中指出的那样,当它成为 Test() 的返回值时,该返回值和 arr 字段具有 no 关系。
【解决方案2】:

分配必须有一个地方来存储分配的值,这必须是一个变量或一个属性(索引器是一种特殊的属性)。

属性赋值被静默转换为方法调用。

Test() = ...

其中Test() 返回的东西不能用作赋值的目标,因为返回的是一个值,而不是一个变量(也不是一个属性)。

【讨论】:

  • 我记得“财产是一种特殊的方法”。 (不确定,是否正确)。属性可以赋值,为什么方法不能赋值。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 2017-05-28
  • 2016-05-09
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多