c# - C# 中的 Foreach struct 奇怪的编译错误

标签 c# generics compiler-construction struct foreach

namespace MyNamespace
{
    public struct MyStruct
    {
        public string MyString;
        public int MyInt;
        public bool MyBool;
    }

    public class MyClass
    {
        private List<MyStruct> MyPrivateVariable;

        public List<MyStruct> MyVariable
        {
            get
            {
                if (MyPrivateVariable == null)
                {
                    MyPrivateVariable = new List<MyStruct>();

                    MyPrivateVariable.Add(new MyStruct());
                    MyPrivateVariable.Add(new MyStruct());
                }

                return MyPrivateVariable;
            }
        }

        public void MyLoop()
        {
            foreach (MyStruct ms in MyVariable)
            {
                // Doesn't compile, but it works if you execute it through the Immediate window, or in Quickwatch
                ms.MyBool = false;

                // Compiles, works
                MyFunction(ms);
            }
        }

        public void MyFunction(MyStruct ms)
        {
            ms.MyBool = false;
        }
    }
}

对此有什么合理的解释吗?

编译器返回:

Error: Cannot modify members of 'ms' because it is 'foreach iteration variable'

编辑:

补充问题:

我只是尝试更改 MyFunction 中的字符串,但它实际上并没有更新 ms。但是:如果我转到 quickwatch 并在那里分配相同的值,它会更新 ms。如果它甚至不应该首先编译,为什么会发生这种情况,quickwatch 不应该抛出异常?

编辑 2:

好的,quick watch 也适用于 ms 的副本,所以这就是我可以编辑它的值的原因,它实际上并没有改变 MyPrivateVariable 的内容。

最佳答案

您将它们用作可变结构。避免这样做:

Why are mutable structs “evil”?

关于c# - C# 中的 Foreach struct 奇怪的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3790207/

相关文章:

java - 如何从不带参数的java中的静态泛型函数进行转换?

java - 我可以使用对象的 vector 来存储扩展该对象的多种类型的对象吗

c# - 是否有任何基于 .NET/CLI 的 C# 编译器实现?

c# - SqlDataAdapter 作为对象值?

c# - 绑定(bind)到依赖属性,而依赖属性又绑定(bind)到另一个绑定(bind)源

java - 破译泛型语法

compiler-construction - 是否有适用于 x86 或 x86_64 的 lolcode 编译器?

mysql - C 中的命名空间冲突

c# - 在 C# 中为 Dynamics 365/crm 2016 创建组织服务代理的最佳实践

c# - 禁止调整 Windows Forms 窗体的大小