C#不能改变返回值?

时间:2015-11-05 09:49:12

标签: c# variables struct

我有点挂在C#结构上。我有以下代码提取(抱歉质量 - 我尽可能减少):

namespace Generics
{
    public struct Generic
    {
        public struct Traverse
        {
            public double TraverseWidth, CurrentPosition;
        }
    }

    public class XXXSettings
    {
        private Generics.Generic.Traverse _TRAVERSE;

        public Generics.Generic.Traverse TraverseData
        {
            get { return _TRAVERSE; }
            set { this._TRAVERSE = TraverseData; }
        }

        public XXXSettings()
        {
            _TRAVERSE = new Generics.Generic.Traverse() { CurrentPosition = 0, TraverseWidth = 0 };
        }
    }
}

namespace XXX_Driver
{
    public class XXXClient
    {
        private Generics.XXXSettings _Settings;

        public Generics.XXXSettings Settings
        {
            get { return _Settings; }
            set { this._Settings = Settings; }
        }
        public bool Connect()
        {
            if (this.Settings == null)
            {
                throw new ArgumentNullException();
            }

            Settings.TraverseData.TraverseWidth = "1234";

        }
    }
}

我的问题:最后一行代码

Settings.TraverseData

标记为“XXXSettings.TraverseData的返回值无法更改,因为它不是变量。”

但为什么会这样呢?我习惯从VB.NET结构而不知道这种行为?!

即使

_Settings.TraverseData.TraverseWidth = new Generics.Generic.Traverse() { TraverseWidth = 1234, CurrentPosition = 0 };

无济于事。 C#中的结构至少有用吗?我认为这是一个价值集团,但如果它们无法访问?!

感谢您提供一些解释和一些提示,我应该如何更改代码:)

2 个答案:

答案 0 :(得分:3)

实际上,TraverseData不是变量:

public Generics.Generic.Traverse TraverseData
{
    get { return _TRAVERSE; }
    set { this._TRAVERSE = TraverseData; } // Mistake is here !!
}

使用value关键字检索实际设定值:

public Generics.Generic.Traverse TraverseData
{
    get { return _TRAVERSE; }
    set { this._TRAVERSE = value; } 
}

答案 1 :(得分:2)

structs不要按照您的预期行事。它们是不可变的

var myStruct = new Struct { Name = "Rob", Gender = "m" };
myStruct.Name = "Test"; 

此代码使用Name" Rob"创建一个结构。然后,它创建一个 new 结构,将值复制到Name除外,它设置为Test

现在,您遇到此错误的原因是因为您使用的是属性,而不是字段或变量。 .NET只执行此操作“复制和替换”#39;自动变量。

有两种方法可以修复您的代码...使用字段(不是最佳方法):

public Generic.Traverse TraverseData;

或者,使用class代替struct - 此方法可能更适合您。

谨慎使用结构。改变结构的属性几乎不是一个好主意,它们意味着不可变。而且,虽然您正在学习C#,但您不太可能需要使用结构而不是类。

VB具有相同的行为,如下所示:

Sub Main
    Dim a as A
    a = new A()
    a.Prop2.Name = "A"
End Sub

Structure Test
    public Name as String
End Structure

Class A
    public property Prop2 As Test = new Test()
End Class

给出错误

  

表达式是一个值,因此不能作为赋值的目标。

将其更改为public Prop2 As Test = new Test()(或使用类而不是struct)按预期工作。