internal TypedColumn(DataViewSchema.Column column, bool isImputed, SharedColumnState state)
 {
     Column      = column;
     SharedState = state;
     IsImputed   = isImputed;
 }
 internal NumericTypedColumn(DataViewSchema.Column column, bool isNullable, bool isImputed, SharedColumnState state) :
     base(column, isImputed, state)
 {
     IsNullable = isNullable;
 }
 internal ByteTypedColumn(DataViewSchema.Column column, bool isNullable, bool isImputed, SharedColumnState state) :
     base(column, isNullable, isImputed, state)
 {
 }
            internal static TypedColumn CreateTypedColumn(DataViewSchema.Column column, string[] optionalColumns, string[] allImputedColumns, SharedColumnState state)
            {
                var type = column.Type.RawType.ToString();

                if (type == typeof(sbyte).ToString())
                {
                    return(new SByteTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(short).ToString())
                {
                    return(new ShortTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(int).ToString())
                {
                    return(new IntTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(long).ToString())
                {
                    return(new LongTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(byte).ToString())
                {
                    return(new ByteTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(ushort).ToString())
                {
                    return(new UShortTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(uint).ToString())
                {
                    return(new UIntTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(ulong).ToString())
                {
                    return(new ULongTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(float).ToString())
                {
                    return(new FloatTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(double).ToString())
                {
                    return(new DoubleTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(ReadOnlyMemory <char>).ToString())
                {
                    return(new StringTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(bool).ToString())
                {
                    return(new BoolTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }
                else if (type == typeof(DateTime).ToString())
                {
                    return(new DateTimeTypedColumn(column, optionalColumns.Contains(column.Name), allImputedColumns.Contains(column.Name), state));
                }

                throw new InvalidOperationException($"Unsupported type {type}");
            }