c# optional parameters vs overloading