public override object Exec(IntersectionType it)
        {
            if (!it.HasTypeVariables())
            {
                return(it);
            }
            IntersectionType       newType    = (IntersectionType)it.MemberwiseClone();
            IList <TypeExpression> oldTypeSet = it.TypeSet;

            newType.TypeSet = new List <TypeExpression>();
            foreach (TypeExpression oldType in oldTypeSet)
            {
                newType.TypeSet.Add((IntersectionType)oldType.Exec(this));
            }
            newType.ValidTypeExpression = false;
            return(newType);
        }