protected override bool TryParse(string str)
            {
                Contracts.AssertNonEmpty(str);

                // We accept N:T:S where N is the new column name, T is the new type,
                // and S is source column names.
                string extra;

                if (!base.TryParse(str, out extra))
                {
                    return(false);
                }
                if (extra == null)
                {
                    return(true);
                }

                InternalDataKind kind;

                if (!TypeParsingUtils.TryParseDataKind(extra, out kind, out KeyCount))
                {
                    return(false);
                }
                ResultType = InternalDataKind2DataKind(kind);
                return(true);
            }
            private protected override bool TryParse(string str)
            {
                Contracts.AssertNonEmpty(str);

                // We accept N:T:S where N is the new column name, T is the new type,
                // and S is source column names.
                if (!base.TryParse(str, out string extra))
                    return false;
                if (extra == null)
                    return true;

                if (!TypeParsingUtils.TryParseDataKind(extra, out DataKind kind, out KeyCount))
                    return false;
                ResultType = kind == default ? default(DataKind?) : kind;
                return true;
            }