interface IFlippable<TResult> : ISided where TResult : struct, Enum
TResult Flip() => Enum.Parse<TResult>(Random.Shared.Next(NumberOfSides).ToString());
int NumberOfSides { get; }
class Coin : IFlippable<FlipResult>
private const int _chanceToLandOnEdge = 6000;
public int NumberOfSides => 2;
if (Random.Shared.Next(_chanceToLandOnEdge) == 0)
return Enum.Parse<FlipResult>(Random.Shared.Next(NumberOfSides).ToString());
class D6 : IFlippable<RollResult>
public int NumberOfSides => 6;
class D10 : IFlippable<RollResult>
public int NumberOfSides => 10;
public static void Main()
for (var i = 0; i < 10; i++)
Console.WriteLine(((IFlippable<FlipResult>)coin).Flip());
Console.WriteLine("----");
for (var i = 0; i < 10; i++)
Console.WriteLine(((IFlippable<RollResult>)d6).Flip());
Console.WriteLine("----");
for (var i = 0; i < 10; i++)
Console.WriteLine(((IFlippable<RollResult>)d10).Flip());