optimize integer validation
To reduce the lines of code to copy/paste, you could create a helper method:
public static class Helper
{
    public static void EnsureIsInRange(short value, short min, short max)
    {
        if (value &lt; min || max &lt; value)
        {
            throw new ArgumentOutOfRangeException(&quot;The passed value is not between &quot; + min + &quot;  and &quot; + max + &quot; (values included)&quot;);
        }
    }
}

or more generic:
public static class Helper
{
    public static void EnsureIsInRange&lt;T&gt;(T value, T min, T max) where T : IComparable&lt;T&gt;
    {
        if (value.CompareTo(min) != 1 || value.CompareTo(max) != -1)
        {
            throw new ArgumentOutOfRangeException(&quot;The passed value is not between &quot; + min + &quot;  and &quot; + max + &quot; (values included)&quot;);
        }
    }
}

// usage:
private short _index;
public short Index
{
    get =&gt; this._index;
    private set
    {
        Helper.EnsureIsInRange(value, 0, 8);
        this._index = value;
    }
}