Method Overloading with different return type [dup

2019-03-24 08:16发布

This question already has an answer here:

I am want to dig in that whether it is an ambiguity or an extra feature that is provided:

 public class Foo 
 { 
    public int Bar(){
       //code
    }

    public string Bar(int a){
       //code
    }
 }

Any one having any experience with this, overloading on return type with different parameters should be a bad practice, is it?

But if the overloading was done on the basis of return type then why this is not working for.

 public class Foo 
 { 
    public int Bar(int a){
       //code
    }

    public string Bar(int a){
       //code
    }
 }

As it will be unable to decide which function to call 1st or second, if we call obj.Bar(); , it should end in error do any one have any idea about it why it allows first code snippet to run.

9条回答
姐就是有狂的资本
2楼-- · 2019-03-24 08:30

C# does not allow it.

C# on the other hand does not support method resolution based on the return type; this was a conscious decision by the language designers not to expose the feature of the CLR which allows it. There's no technical reason why they couldn't have done, they just felt it better not to. Because the return value is not used for method selection a C# method signature does not include it.

查看更多
SAY GOODBYE
3楼-- · 2019-03-24 08:34

This is logically impossible. Consider the following call:

object o = Bar(42);

or even

var o = Bar(42);

How would the compiler know which method to call?

Edit: Now that I understand what you're actually asking, I think overloading by meaningless parameters is bad practice, and diminished readability, it is much preferable to distinguish by method name:

 string BarToStr()
 {

 }

 int BarToInt()
 {

 }
查看更多
一纸荒年 Trace。
4楼-- · 2019-03-24 08:35

You can not overload the function by differing only their return type. You can only overload the function in the following ways

  1. Parameter types
  2. Number of parameters
  3. Order of the parameters declared in the method

You can not come to know which function is actually called (if it was possible).

One more thing I would like to add is function overloading is providing a function with the same name, but with a different signature. but the return type of a method is not considered as a part of the method's signature.

So this is another way to understand why method overloading can't be done only by return type.

查看更多
一纸荒年 Trace。
5楼-- · 2019-03-24 08:36

You can't create method with same name, same number and types of parameters.

For more details refer this link.

查看更多
等我变得足够好
6楼-- · 2019-03-24 08:42

Your code will result in a Compiler Error. You can not have a Method of the same name with the same parameters and a different return type, the caller would not know which Method to call (will not be able to resolve the location in Memory of the Method to call, why the Compiler would not allow it). Your alternative would be to return an Object and Cast it based on what the Caller knows. Even then, that appears to be Bad design.

This will Work (meaning Compile), but still bad design.

public class Foo
{
    public object Bar(int a)
    {
        return a;
    }
}
查看更多
叛逆
7楼-- · 2019-03-24 08:43

The C# specification (section 10.6) states that overloaded members may not differ by only return type and as per http://msdn.microsoft.com/en-us/library/ms229029.aspx

As per your question regarding creating parameters simply to support differing return types? I personally believe that is a terrible solution to the problem. Code maintenance will become difficult and unused parameters are a definite code smell. Does the method really need to be overloaded in that case? Or does it belong in that class? Should something else be created to convert from one return type to another? All things you should ask to derive a more idiomatic solution.

查看更多
登录 后发表回答