【问题标题】:C# Overload return type - recommended approachC# 重载返回类型 - 推荐的方法
【发布时间】:2013-05-23 19:32:20
【问题描述】:

我有一种情况,我只是希望方法重载的返回类型不同,但你不能在 C# 中这样做。

处理此问题的最佳方法是什么?我需要这个事实是否意味着我的程序结构有缺陷?

鉴于这在 C# 中是不可能的,推荐的方法是什么?

【问题讨论】:

  • 这个方法有什么作用?
  • 以 LinkedList 或 Dictionary 的形式检索数据列表。
  • 随着var 关键字的出现,如果没有歧义,这根本不可能实现。见function-overloading-by-return-type

标签: c# .net overloading return-type


【解决方案1】:

通常,您只需为方法指定不同的名称。

这方面的一个例子是IDataReaderGetInt32GetInt64 等。

老实说,我相信这通常会让你更清楚你想要做什么 - 特别是如果你然后调用一个重载方法的结果:

Console.WriteLine(reader.GetInt32()); // This is clear

Console.WriteLine(foo.OverloadedGet()); // Which overload of OverloadedGet?

【讨论】:

  • 被接受为答案,因为重命名使其更清晰的事实是我正在寻找的答案。
【解决方案2】:

鉴于这在 C# 中是不可能的,推荐的方法是什么?

这取决于你为什么需要这个。

最常见的方法是使用不同的名称。框架在很多情况下都会这样做,例如Convert class

如果你想支持多种类型,你可以通过泛型方法做到这一点:

T SomeMethod<T>()
  // Optionally add constraints:"
  where T : IFoo
{

通用方法方法对于存储库很常见,因为通常存在“实体”类型的基类。

【讨论】:

    【解决方案3】:

    你可以有另一个参数来指定返回类型。

    public static T[] Method1<T>(int i, T type)
    {
        return new T[i];
    }
    

    【讨论】:

    • 您根本不需要T type 参数即可使其工作。不需要它,因为您没有使用它;)
    • @ReedCopsey 它允许我拥有:string[] s1 = Method1(3, "a"); 而不是 string[] s2 = Method1&lt;string&gt;(3);。 (没什么大不了的。我知道。)
    • @ReedCopsey 我现在看到你有这种类型的答案。回答时,我只是看到了您回答的开头,所以我没有注意到。
    【解决方案4】:

    我已经发布了答案,但这里有另一种方式:使用object's。

    object TheMethod(MyEnum type)
    {
        if (type == MyEnum.A) return (object)SubMethod1();
        else if (type == MyEnum.B) return (object)SubMethod2();
        //...
    }
    
    int SubMethod1() { return 1; }
    string SubMethod2() { return "a"; }
    

    并将结果转换为适当的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多