// Hash codes are needed for successful lookup in dictionaries
        public override int GetHashCode()
        {
            const int seed     = 103;
            const int modifier = 23;

            // We go unchecked in order to let the integer automatically overflow for better hashing chaos
            unchecked
            {
                return(ParameterTypes.Aggregate(
                           (seed + ReturnType.GetHashCode()) * modifier,
                           (cur, item) => (cur * modifier) + item.GetHashCode()
                           ));
            }
        }