C#无法更改返回值

本文关键字:返回值 | 更新日期: 2023-09-27 18:20:50

我对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#中的structs至少有什么用处吗?我以为这是一个价值观的集合体,但如果它们不可访问?!

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

C#无法更改返回值

实际上,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; } 
}

structs的行为与您预期的不同。它们是不可变的。

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

这段代码创建了一个名为"Rob"的结构。然后,它创建一个新的结构,复制除Name之外的值,并将其设置为Test

现在,出现此错误的原因是您使用的是属性,而不是字段或变量。NET仅对变量自动执行此"复制并替换"操作。

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

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()(或使用类而不是结构)可以按预期工作。