【问题标题】:Overloading with same parameter signature使用相同的参数签名重载
【发布时间】:2012-03-17 01:35:43
【问题描述】:

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

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

C# 返回编译错误

【问题讨论】:

  • 如果我不分配返回值,而是直接调用Search(field, param);,会发生什么?
  • 我明白你的暗示,我也想过,

标签: c# overloading


【解决方案1】:

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

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

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

【讨论】:

  • 我想,我会列出一个清单
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    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;
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • @Adam V - 它也使用方法名 ;)
        • @Oded - 认为没有必要这么说。 :)
        • @Oded, :) 不像编译器会到处寻找所有可能的方法来接受特定参数序列,而不管名称如何......对不起,这个想法让我笑了,所以我不得不分享。
        【解决方案6】:

        不,你不能。

        CLR 允许这样做,但出于某种原因,C# 家伙决定不使用此 CLR 功能。

        【讨论】:

        • 很难支持一种应该是 C 家族成员的语言,其成员通常没有上下文相关评估的概念。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多