/// <summary>
        /// Attempts to interpret this instance as List(U) whereby U is a struct, applying a selector function to each element.
        /// </summary>
        /// <param name="cons">Selector function</param>
        /// <returns>The desired representation</returns>
        public override IReadOnlyList <U> Cast <U>(Func <DeserializerState, U> cons)
        {
            switch (Marshal.SizeOf <T>())
            {
            case 1: return(PrimitiveCast <byte>().LazyListSelect(x => cons(DeserializerState.MakeValueState(x))));

            case 2: return(PrimitiveCast <ushort>().LazyListSelect(x => cons(DeserializerState.MakeValueState(x))));

            case 4: return(PrimitiveCast <uint>().LazyListSelect(x => cons(DeserializerState.MakeValueState(x))));

            case 8: return(new ListOfULongAsStructView <U>(PrimitiveCast <ulong>(), cons));

            default:
                throw new InvalidProgramException("This program path should not be reachable");
            }
        }