2010-05-01 105 views
6

在C#中超载,是有可能有相同的参数又互相覆盖(他们在返回类型不同)具有相同的参数签名

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

C#返回编译错误

+0

如果我没有指派返回值会发生什么,但而只是叫做“Search(field,param);'? – 2010-05-01 16:21:50

+0

我明白你的暗示什么,我也想过这个问题为好, – Soham 2010-05-01 19:03:07

回答

0

至于我知道,这是不可能的。

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

11

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

的方法的返回类型不被包括在签名 - 只有方法的名称,类型和参数的数量(和它们的顺序)。这两个例子具有相同的签名,所以它们不能一起存在。

经典,可以恢复项目(数组或其他数据结构)的列表 - 如果只需要一个项目,你只需用一个项目返回一个列表。

+0

我想,我会用一个列表 – Soham 2010-05-01 19:04:31

0

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

+1

@Adam V进 - 它也使用方法名;) – Oded 2010-05-01 16:18:41

+0

@Oded - 想通这是不必要的说。 :) – 2010-05-01 16:21:34

+0

@Oded,:)不像编译器会运行寻找接受特定参数序列的所有可能的方法,而不考虑名称......对不起,这个想法让我不得不分享。 – 2010-05-01 16:24:52

0

不,你不能。

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

+2

很难用一种被认为是C族成员的语言来支持,他们的成员通常没有情境依赖评估的概念。 – 2010-05-01 16:27:33

3

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

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

想一想:编译器应该如何知道调用哪个方法变量?这显然取决于你的搜索结果,显然编译器不能提前知道。

其实,你想要的是一个函数有两种可能的返回类型。你不要想要的是两个独立的方法,因为你必须先决定哪一个要打电话。这显然是错误的方法。

一种解决方案是总是返回一个数组;在只有一个Stocks找到对象的情况下,通过使用多个接口,返回尺寸1.

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; 
    } 
} 
相关问题