Beware of object initializers in Unity3D
using System;
using UnityEngine;
public class ObjectInitializer : MonoBehaviour
{
public string[] names = { "Hello", "World" };
void Start()
{
Debug.Log("Name: " + GetName(new Settings { mySetting = 1 }));
Debug.Log("Name: " + GetName(new Settings { mySetting = 0 }));
}
private string GetName(Settings sett)
{
if (sett.mySetting == Settings.INVALID_SETTING)
throw new Exception("Error: Setting not set");
return names[sett.mySetting];
}
}
public class Settings
{
public const int INVALID_SETTING = -1;
public int mySetting = INVALID_SETTING;
}
The second GetName call throws an exception because the mySetting = 0 is removed during compilation. The reason for that removal is probably because 0 is the default value for int, and thus it is assumed that it can be ignored. This would be the same case if mySetting was a boolean that was defaulting to true, but the object initializer was attempting to set it to false, since false is the default value for booleans.
This is not the case for "normal" Mono or .NET.
This is still true as of Unity3D 4.3.4f1
Written by Panagiotis Peikidis
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Game development
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#