使用相同的参数签名重载

时间:2010-05-01 16:13:32

标签: c# overloading

在C#中,是否可以使相同的参数相互覆盖(它们在返回类型中不同)

public override Stocks[] Search(string Field,string Param){ //some code}
public override Stocks Search(string Field, string Param){//some code}

C#返回编译错误

6 个答案:

答案 0 :(得分:11)

在C#中,您只能重载具有不同签名的方法。

签名中不包含方法的返回类型 - 仅包括方法名称,类型和参数数量(及其顺序)。这两个例子具有相同的签名,因此它们不能一起存在。

经典地,人们可以返回项目的列表(数组或其他数据结构) - 如果只需要一个项目,您只需返回一个包含一个项目的列表。

答案 1 :(得分:3)

正如Oded已经在他的回答中指出的那样,当唯一的区别是返回类型时,不可能重载方法。

public override Stocks[] Search(string Field,string Param){ //some code}
public override Stocks Search(string Field, string Param){//some code}

考虑一下:编译器应该如何知道要调用哪个方法变体?这显然取决于您的搜索结果,显然编译器无法提前知道。

事实上,你想要的是一个函数,它有两种可能的返回类型。您想要的是两种不同的方法,因为您必须事先决定调用哪一种方法。这显然是错误的做法。

一种解决方案是始终返回一个数组;如果只找到一个Stocks对象,则返回一个大小为1的数组。

答案 2 :(得分:1)

通过使用多个接口的方式:

struct Stock { public string Symbol; public decimal Price;}
interface IByArray { Stock[] Search(string Field, string Param); }
interface IByClass { Stocks Search(string Field, string Param); }
class Stocks : IByArray, IByClass
{
    Stock[] _stocks = { new Stock { Symbol = "MSFT", Price = 32.83m } };
    Stock[] IByArray.Search(string Field, string Param)
    {
        return _stocks;
    }
    Stocks IByClass.Search(string Field, string Param)
    {
        return this;
    }
}

答案 3 :(得分:0)

据我所知,这是不可能的。

即使它是,它也不必要地复杂化。只是在所有情况下返回一个数组(如果只返回一个值,那么它是一个Stocks [1]数组)。这应该可以节省一些时间,特别是因为C#使得使用数组非常简单。

答案 4 :(得分:0)

否 - 编译器抛出错误,因为它只使用参数来确定要调用的方法,而不是返回类型。

答案 5 :(得分:0)

不,你不能。

CLR允许它,但由于某种原因,C#dudes决定不使用此CLR功能。