public CoreClassifier getReturnType(List <object> argumentTypes)
        {
            CollectionTypeImpl collection = (CollectionTypeImpl)getFeatureOwner();

            CoreClassifier returnType = getJmiOperation().getReturnType();

            if (getName().Equals("collect"))
            {
                CoreClassifier elementType = (CoreClassifier)argumentTypes[0];
                if (elementType is CollectionTypeImpl)
                {
                    elementType = ((CollectionTypeImpl)elementType).getInnerMostElementType();
                }
                CoreClassifier type = collection.getFactory().createCollectionType(collection.getReturnTypeForCollect(), elementType);
                return(type);
            }
            else if (getName().Equals("collectNested"))
            {
                return(collection.getFactory().createCollectionType(returnType.getName(), (CoreClassifier)argumentTypes[0]));
            }
            else if (returnType.getName().Equals("<T>"))
            {
                return(collection.getElementType());
            }
            else if (OclTypesDefinition.isOclGenericCollectionType(returnType.getName()))
            {
                if (returnType.getName().IndexOf("<T>") >= 0)
                {
                    if (((CollectionType)getFeatureOwner()).getElementType().getName().Equals("OclVoid"))
                    {
                        CoreClassifier argumentElementType;
                        if (argumentTypes.Count == 0)
                        {
                            argumentElementType = collection.getElementType();
                        }
                        else if (argumentTypes[0] is CollectionTypeImpl)
                        {
                            argumentElementType = ((CollectionType)argumentTypes[0]).getElementType();
                        }
                        else
                        {
                            argumentElementType = (CoreClassifier)argumentTypes[0];
                        }
                        return(collection.getFactory().createCollectionType(returnType.getName(), argumentElementType));
                    }
                    else
                    {
                        return(collection.getFactory().createCollectionType(returnType.getName(), collection.getElementType()));
                    }
                }
                else if (returnType.getName().IndexOf("<T2>") >= 0)
                {
                    return(collection.getFactory().createCollectionType(returnType.getName(), collection.getInnerMostElementType()));
                }
                else
                {
                    return(null);
                }
            }
            else if (returnType.getName().StartsWith("Set(Tuple"))
            {
                if (argumentTypes.Count > 0)
                {
                    CollectionType collectionParameter = (CollectionType)argumentTypes[0];

                    TupleTypeImpl tupleType = (TupleTypeImpl)collection.getFactory().createTupleType();
                    tupleType.addElement("first", collection.getElementType());
                    tupleType.addElement("second", collectionParameter.getElementType());
                    return(collection.getFactory().createCollectionType("Set", tupleType));
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                return(returnType);
            }
        }