方法使用不同的返回类型重载

时间:2013-12-20 14:20:38

标签: c# .net oop coding-style

我想深入了解它是否含糊不清或提供了额外的功能:

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

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

任何有这方面经验的人,在不同参数的返回类型上重载应该是一种不好的做法,是吗?

但是如果重载是在返回类型的基础上完成的,那么为什么这不起作用。

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

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

因为如果我们调用obj.Bar(),它将无法决定调用1st或second的函数。 ,它应该以错误结束,任何人都知道为什么它允许第一个代码片段运行。

9 个答案:

答案 0 :(得分:30)

C#规范(第10.6节)规定,重载成员可能不会因返回类型和http://msdn.microsoft.com/en-us/library/ms229029.aspx

而有所不同

根据您关于创建参数的问题,只是为了支持不同的返回类型?我个人认为这是解决问题的可怕办法。代码维护将变得困难,未使用的参数是明确的代码味道。在这种情况下,该方法是否确实需要重载?或者它属于那个班级?是否应该创建其他东西以从一种返回类型转换为另一种类型?所有你应该要求的东西,以获得更惯用的解决方案。

答案 1 :(得分:17)

这在逻辑上是不可能的。请考虑以下呼叫:

object o = Bar(42);

甚至

var o = Bar(42);

编译器如何知道调用哪种方法?

编辑: 既然我明白你实际上在想什么,我认为通过无意义的参数进行重载是不好的做法,并且可读性降低了,更可取的是用方法名称来区分:

 string BarToStr()
 {

 }

 int BarToInt()
 {

 }

答案 2 :(得分:8)

其他人已经解释过这种情况。我只想补充一点:你可以通过使用泛型类型参数来实现你的想法:

public T Bar<T>(int a) {
   // code
}

并称之为:

int i = Bar<int>(42);
string s = Bar<string>(42);

问题在于,通常难以使​​用泛型类型执行某些有意义的操作,例如:你不能对它应用算术运算。有时generic type constraints可以提供帮助。

答案 3 :(得分:4)

您不能仅通过改变其返回类型来重载该函数。 您只能通过以下方式重载该功能

  1. 参数类型
  2. 参数数量
  3. 方法中声明的参数的顺序
  4. 你无法知道实际调用了哪个函数(如果可能的话)。

    我想补充的另一件事是 函数重载是提供具有相同名称但具有不同签名的函数。但方法的返回类型不被视为方法签名的一部分。

    所以这是理解为什么不能仅通过返回类型来完成方法重载的另一种方法。

答案 4 :(得分:2)

  

任何对此有任何经验的人,在返回类型上重载   不同的参数应该是一个不好的做法,是吧。

我认为这意味着 - “使用不同的参数组合来促进不同的返回类型是不好的做法” - 如果这确实是问题,那么只需想象其他人在几个月内遇到此代码 - 有效的“虚拟”参数来确定返回类型......很难理解发生了什么。

编辑 - 正如ChrisLava所指出的那样“解决这个问题的方法是为每个函数设置更好的名称(而不是重载)。在应用程序中具有明确含义的名称。没有理由为什么Bar应该返回一个int和一个字符串我只能在int“

上看到调用ToString()

答案 5 :(得分:1)

C# does not allow it

  另一方面,C#不支持基于的方法解析   返回类型;这是语言设计师的有意识决定   不公开允许它的CLR功能。没有   他们无法做到的技术原因,他们感觉更好   不要。因为返回值不用于方法选择a   C#方法签名不包括它。

答案 6 :(得分:0)

您无法创建具有相同名称,相同数量和参数类型的方法。

有关详细信息,请参阅此link

答案 7 :(得分:0)

检查一下..你不能拥有相同签名和不同返回类型的方法。在这个问题中提到了推荐。

C# Overload return type - recommended approach

答案 8 :(得分:0)

您的代码将导致编译器错误。您不能使用具有相同参数和不同返回类型的相同名称的方法,调用者不知道要调用哪个方法(将无法解析要调用的方法的内存中的位置,为什么编译器会不允许它)。您可以选择返回一个Object并根据调用者知道的内容将其强制转换。即便如此,这似乎是糟糕的设计。

这将起作用(意味着编译),但设计仍然不好。

public class Foo
{
    public object Bar(int a)
    {
        return a;
    }
}