I’m using a typesafe enum pattern with my code and may have come across a netMF bug. I have some static objects that are initialized too late and shouldn’t be. Can someone else try this code to confirm?
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
namespace MyBug
{
public class Program
{
static MyDeviceSetting Settings;
public static void Main()
{
while(true)
{
Debug.Print(MyDeviceSetting.BLAH.Name);
Debug.Print(MyDeviceSetting.TempUnits.Name);
}
}
}
public class MyDeviceSetting //parent
{
public readonly string Name;
public MyUnit SettingUnit;
public readonly MyUnit.UnitPurpose UnitPurpose;
#region MY STATIC SETTINGS
//UNIT SETTINGS
public static MyDeviceSetting TempUnits = new MyDeviceSetting("TempUnits", MyUnit.mm);//MyUnit.mm is NULL it should not be
public static MyDeviceSetting BLAH = new MyDeviceSetting("BLAH", MyUnit.inch);//MyUnit.Inch is NULL it should not be.
#endregion
/// <summary>
/// This is the MAIN PRIVATE Constructor
/// </summary>
/// <param name="?"></param>
private MyDeviceSetting(string name, MyUnit defaultUnit)
{
Name = name;
SettingUnit = defaultUnit;//NULL <- passed in as null because it won't initialize
UnitPurpose = SettingUnit.Purpose; //fails because SettingUnit is NULL
}
}
public sealed class MyUnit
{
private static int Count = 0;
//these are used to store and identify the unit in memory
public readonly int UnitID;
public readonly int TestID;
public enum UnitPurpose
{
DISTANCE,
SPEED,
TEMPERATURE,
TIME,
CLOCK,
NO_UNITS
}
public readonly string DisplayName;
public readonly string Abbreviation;
public readonly string Name;
public readonly UnitPurpose Purpose;
#region My Units
public static readonly MyUnit mm = new MyUnit("Milimeters", "mm", "mm", UnitPurpose.DISTANCE, 1);
public static readonly MyUnit inch = new MyUnit("inch", "inch", "in", UnitPurpose.DISTANCE, 2);
#endregion
private MyUnit(string name,
string displayName,
string abbreviation,
UnitPurpose unitPurpose,
int unitID)
{
Name = name;
DisplayName = displayName;
Abbreviation = abbreviation;
Purpose = unitPurpose;
UnitID = unitID;
TestID = Count;
Count++;
}
}
}