using System.Collections.Generic;
public static void Main()
ColorValue badColorValue = (ColorValue)int.MaxValue;
Console.WriteLine($"Not really a color value, so the result is null: {(badColorValue?.ToString() ?? "[NULL]")}");
ColorValue defaultColorValue = default(ColorValue);
Console.WriteLine($"The underlying value is 0 which isn't defined in the list, so the result is null: {(defaultColorValue?.ToString() ?? "[NULL]")}");
ColorValue goodColorValue = (ColorValue)"Green";
Console.WriteLine($"Green is a valid color value: {(goodColorValue?.ToString() ?? "[NULL]")}");
public static readonly ColorValue Default = new ColorValue { Id = -1, Name = "Black" };
public static readonly ColorValue Blue = new ColorValue { Id = 1, Name = "Blue" };
public static readonly ColorValue Green = new ColorValue { Id = 2, Name = "Green" };
public static readonly ColorValue White = new ColorValue { Id = 3, Name = "White" };
private static readonly Lazy<IEnumerable<ColorValue>> _values = new(() => new List<ColorValue>() { Default, Blue, Green, White });
public int Id { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public static explicit operator ColorValue(int id)
return _values!.Value.FirstOrDefault(x => x.Id == id);
public static explicit operator ColorValue(string name)
return _values!.Value.FirstOrDefault(x => x.Name == name);
public override string ToString() {