【问题标题】:Error left-hand-side-of-an-assignment-must-be-a-variable错误左侧的赋值必须是变量
【发布时间】:2016-01-13 07:11:14
【问题描述】:

我目前正在从 Vb6 转换为 C#,其中允许使用以下 Vb6 代码:

Private Property Let gUnit(Optional bResolve As Boolean, aNoseHi)
    gNoseLo(Optional parameter) = 0  
End Property

不允许:

void Test()
{
    gNoseLo(false) = 0   //error occurs here
}

gNoseLo 已在 VB6 中定义为 Private Property Get gNoseLo(Optional bResolve As Boolean)。我不能在 C# 中使用公共属性方法,因为有参数所以我使用了一种方法。重新编码gNoseLo 以接受值分配并防止错误的正确方法是什么?

【问题讨论】:

  • 将值作为额外参数传递?
  • 真的需要这个参数吗?它是干什么用的?函数有什么作用?也许您应该在翻译代码时考虑重新设计?
  • 原来的 VB6 一定不能这样,因为那甚至不是有效的语法。

标签: c# vb6


【解决方案1】:

C# 中的“带参数的属性”是索引器。虽然1,您不能像在 VB 中那样给它起一个名字。你这样声明它:

public int this[bool parameter]
{
    get { ... }
    set { ...}
}

现在这可能适合也可能不适合您的用例。替代方案是:

  • 有一个常规属性返回带有索引器的东西:

    public class IndexedByBoolean
    {
        public int this[bool parameter]
        {
            get { ... }
            set { ...}
        }
    }
    
    public class ContainsPropertyIndexedByBool
    {
        private readonly IndexedByBoolean index;
    
        public IndexedByBoolean NoseLo { get { return index; } }
    }
    

    那么你可以使用foo.NoseLo[true] = 0

  • 使用GetSet 方法:

    SetNoseLo(true, 0);
    

1 好吧,您指定一个名称,但不使用它通过该名称。

【讨论】:

  • 约翰斯基特,感谢您的帮助!谢谢。
猜你喜欢
  • 2012-06-29
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多