WSDL does not show the original method signature; instead, it shows the input parameters as a group and the output parameters as another group. When Add Service Reference generates client side proxy, it will download and parse WSDL, then construct a C# method with the specified input and output parameters. Since WSDL does not contain the original method signature, Add Service Reference has its own rule, which happens to be: generate out parameters first, then in parameters. Therefore the behavior you are observing is by design.
If you would like to change the order of the parameters, you can simply modify the client proxy in Reference.cs file generated by Add Service Reference. The reason why you are getting compilation error is because client proxy in Reference.cs file is generated in one order and you are trying to use it in a different order.
Additional Note: Although the order between in-arg and out-arg does not matter, the relative order among all in-args and the relative order among all the out-args need to be preserved. For example:
Service: Foo(arg1, arg2, out arg3);
Client: Foo(out arg3, arg1, arg2); // This is OK.
Client: Foo(arg2, arg1, out arg3); // This is bad. It may lead to unexpected behavior at runtime.
If you would like to change the order of the parameters, you can simply modify the client proxy in Reference.cs file generated by Add Service Reference. The reason why you are getting compilation error is because client proxy in Reference.cs file is generated in one order and you are trying to use it in a different order.
Additional Note: Although the order between in-arg and out-arg does not matter, the relative order among all in-args and the relative order among all the out-args need to be preserved. For example:
Service: Foo(arg1, arg2, out arg3);
Client: Foo(out arg3, arg1, arg2); // This is OK.
Client: Foo(arg2, arg1, out arg3); // This is bad. It may lead to unexpected behavior at runtime.