Cuidado com os inicializadores de objeto no 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;
}

A segunda chamada GetName lança uma exceção porque mySetting = 0 é removido durante a compilação. A razão para essa remoção é provavelmente porque 0 é o valor padrão para int e, portanto, presume-se que ele pode ser ignorado. Este seria o mesmo caso se mySetting fosse um booleano que estava sendo padronizado como verdadeiro, mas o inicializador de objetos estava tentando defini-lo como falso, já que false é o valor padrão para booleanos.

Este não é o caso do Mono ou .NET “normal”.

Isso ainda é verdade no Unity3D 4.3.4f1