为什么这个函数重载不起作用?

Zol*_*res 0 c# generics overloading c#-3.0

Hy,我知道这听起来是一个非常愚蠢的问题.
这是我发现的:

public static List<SomeDTO> GetData(Guid userId, int languageId)
 {
 // Do something here
 }

    public static List<int> GetData(Guid userId ,int iNumberOfItems)
    {
      var result = GetData(userID,0);

     return  (from r in result select c.id).Take(iNumberOfItems).ToList<int>();
    }
Run Code Online (Sandbox Code Playgroud)

我得到一个编译错误:

ClassLibrary'已经定义了一个名为'GetData'的成员,它具有相同的参数类型

第二个只返回第一个函数的id.

我知道这不起作用.
我知道有两个返回List <>类型,但它们返回不同的类型.
有人可以解释一下为什么吗?
我怎么解决这个问题?

更新此问题在F#上解决了!

Pat*_*and 12

您无法基于返回类型覆盖.如果查看方法签名,它看起来如下所示:

public static List<SomeDTO> GetData(Guid, int)
Run Code Online (Sandbox Code Playgroud)

public static List<int> GetData(Guid, int)
Run Code Online (Sandbox Code Playgroud)

您需要做的是以下之一:

  • 将方法名称更改为更清晰的名称.
  • 确保参数可以识别要调用的方法

现在,当您调用函数时,未指定返回类型.由于参数看起来相同,编译器不知道要调用哪个函数.但它不需要猜测,因为签名过于相似,它在编译时抱怨.


Pau*_*ulB 5

方法的返回类型不是签名的一部分.

如果您编码,将调用哪个

object obj = GetData(Guid userId, int languageId);  ?
Run Code Online (Sandbox Code Playgroud)

  • 这可能很有用 - > http://msdn.microsoft.com/en-us/library/aa691131%28VS.71%29.aspx (3认同)
  • 不,他突出了问题,因为var/object obj = GetData(...)是一个合法的调用,无法解析为特定的方法.您必须更改名称或参数. (2认同)
  • @Maximilian:CLR*会将返回类型视为方法签名的一部分.但是,C#的语法是这样的,语言编译器无法解决歧义,因此编译器不允许它.转换运算符是一种特殊情况,因为编译器*可以*明确地解析它们,因此允许它们在返回类型上有所不同.VB.NET也是如此. (2认同)

Max*_*erl 5

在C#中,不允许方法重载仅因返回类型而不同(但转换运算符除外).

只需创建两种不同的方法,这是解决这个问题的唯一方法.

  • 也无法在C++中实现 (3认同)