- Home /
Object initializer Compiler BUG?
I just came across this really weird behavior I'm almost certain it's a bug
using UnityEngine;
public class TempScript : MonoBehaviour
{
public class Test
{
public bool Boolean = true;
public override string ToString()
{
return Boolean.ToString();
}
}
[ContextMenu("Init Test")]
public void InitTest()
{
var test = new Test() { Boolean = false };
print(test);
}
}
The output is "True"! - It's ignoring the 'false' value I'm initializing it with.
AFAIK that should compile to:
var test = new Test();
test.Boolean = false;
Can anyone confirm? Tested on my machine and my partner's (who told me about it)
What's going on?!
Using Unity 5.0.1f1 Personal
EDIT: Here's more tests, using constructor and manually settings the field, both output the correct result (false). There's definitely something wrong using the initializer.
public class Test2
{
public bool Boolean = true;
public Test2(bool b)
{
Boolean = b;
}
public override string ToString()
{
return Boolean.ToString();
}
}
[ContextMenu("Manual Set Test")]
public void ManualSetTest()
{
var test = new Test();
test.Boolean = false;
print(test);
}
[ContextMenu("Ctor Test")]
public void CtorTest()
{
var test2 = new Test2(false);
print(test2);
}
Answer by HarshadK · May 22, 2015 at 10:48 AM
I would say it is a bug.
Just tested the following code by just interchanging the values for Boolean
like:
using UnityEngine;
public class TempScript : MonoBehaviour
{
public class Test
{
public bool Boolean = false;
public override string ToString()
{
return Boolean.ToString();
}
}
[ContextMenu("Init Test")]
public void InitTest()
{
var test = new Test() { Boolean = true };
print(test);
}
}
And Viola! it printed the correct output i.e. "True" which is the value passed in the initialization.
I also tried without providing any default value to Boolean in variable declaration as:
using UnityEngine;
public class TempScript : MonoBehaviour
{
public class Test
{
public bool Boolean;
public override string ToString()
{
return Boolean.ToString();
}
}
[ContextMenu("Init Test")]
public void InitTest()
{
var test = new Test() { Boolean = true };
print(test);
}
}
and it works correct in both the cases.
So I'm sure it is a bug. Using 5.0.0f4.
EDIT:
Did some more tests with code below:
using UnityEngine;
public class TempScript : MonoBehaviour
{
public class Test
{
public bool Boolean = true;
public Test()
{
Debug.Log("Inside constructor: " + Boolean.ToString());
}
public override string ToString()
{
return Boolean.ToString();
}
}
[ContextMenu("Init Test")]
public void InitTest()
{
var test = new Test() { Boolean = false };
print(test);
}
}
The results were:
Default: true, Argument: true; Inside Constructor: True, True;
Default: false, Argument: false; Inside Constructor: False, False;
Default: true, Argument: false; Inside Constructor: True, True;
Default: false, Argument: true; Inside Constructor: False, True;
The output looks like compiler is performing a Logical OR between the default value and argument after instantiation and before assigning the argument value to the variable and then assigning the result to the variable.
Your answer
![](https://koobas.hobune.stream/wayback/20220613200147im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Microsoft vs Mono C# compiler initialisation differences. Is this a bug in Mono? 2 Answers
Initialising List array for use in a custom Editor 1 Answer
could not initialize home screen window ?? win 8.1 2 Answers
Time.deltaTime not set to 0 if Time.timeScale set to 0 too early! 4 Answers
Help in solving bug in my code :) 1 Answer