gpt4 book ai didi

c# - 在 C# 中,字段初始化器和对象初始化器如何交互?

转载 作者:太空狗 更新时间:2023-10-29 22:17:20 25 4
gpt4 key购买 nike

我主要是一名 C++ 开发人员,但最近我一直在用 C# 开发一个项目。今天我在使用对象初始值设定项时遇到了一些意想不到的行为,至少对我来说是这样。我希望这里有人可以解释发生了什么。

例子A

public class Foo {
public bool Bar = false;
}

PassInFoo( new Foo { Bar = true } );

示例 B

public class Foo {
public bool Bar = true;
}

PassInFoo( new Foo { Bar = false } );

示例 A 如我所料。传递给 PassInFoo 的对象将 Bar 设置为 true。然而,在示例 B 中,foo.Bar 被设置为 true,尽管在对象初始值设定项中被分配为 false。什么会导致示例 B 中的对象初始值设定项看似被忽略?

最佳答案

我在 Mono 的 Unity3d 版本(Mono 2.6.5、Unity3d 4.1.2f1、OSX)中确认了这个丑陋的错误。

看起来它不喜欢使用 ValueType 的默认值,因此您可以传递 int != 0(bool)true 等很好,但是传递默认值,如 (int)0(bool)false 会忽略它的值。

证明:

using UnityEngine;
using System.Collections;

public class Foo1 {
public bool Bar=false;
}

public class Foo2 {
public bool Bar=true;
}

public class Foo1i {
public int Bar=0;
}

public class Foo2i {
public int Bar=42;
}

public class PropTest:MonoBehaviour {

void Start() {
PassInFoo(new Foo1 {Bar=true}); // FOO1: True (OK)
PassInFoo(new Foo2 {Bar=false});/// FOO2: True (FAIL!)
PassInFoo(new Foo1i {Bar=42}); // FOO1i: 42 (OK)
PassInFoo(new Foo2i {Bar=0});/// FOO2i: 42 (FAIL!)
PassInFoo(new Foo2i {Bar=13});/// FOO2i: 13 (OK)
}

void PassInFoo(Foo1 f) {Debug.Log("FOO1: "+f.Bar);}

void PassInFoo(Foo2 f) {Debug.Log("FOO2: "+f.Bar);}

void PassInFoo(Foo1i f) {Debug.Log("FOO1i: "+f.Bar);}

void PassInFoo(Foo2i f) {Debug.Log("FOO2i: "+f.Bar);}
}

在非 unity3d OSX Mono 2.10.11(mono-2-10/2baeee2 Wed Jan 16 16:40:16 EST 2013)上,测试运行良好:

FOO1: True
FOO2: False
FOO1i: 42
FOO2i: 0
FOO2i: 13

编辑:在 unity3d 的错误追踪器中填写了一个错误:https://fogbugz.unity3d.com/default.asp?548851_3gh8hi55oum1btda

关于c# - 在 C# 中,字段初始化器和对象初始化器如何交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5799458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com