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

时间:2009-10-09 07:04:51

标签: c# generics c#-3.0 overloading

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

我收到编译错误:

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

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

我知道这不起作用。
我知道两者都返回 List&lt;&gt; 类型,但它们会返回不同的类型。
有人可以解释一下原因吗? 我该如何解决这个问题?

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

6 个答案:

答案 0 :(得分:12)

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

public static List<SomeDTO> GetData(Guid, int)

public static List<int> GetData(Guid, int)

您需要做的是以下之一:

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

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

答案 1 :(得分:5)

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

如果您编码

,将会调用哪个
object obj = GetData(Guid userId, int languageId);  ?

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

方法重载只查看方法的名称及其参数的数量和类型,而不是返回值的类型。这就是你得到错误的原因。

如果两个函数或多或少都做同样的事情,你可以通过创建泛型函数来解决这个问题,例如:

public static List<T> GetData<T>(Guid userId, int param2)

但在您的示例中似乎并非如此。

答案 4 :(得分:2)

这里的其他答案都是有效的。来自 PatrikAkerstrand answer you accepted对您收到编译错误的原因有很好的解释。

在这种情况下,我建议更改第二个的方法名称,因为它确实在它的作用方面存在逻辑差异。你只是没有得到“数据”,你专门得到了总数据集的ID:

public static List<SomeDTO> GetData(Guid userId, int languageId)
{
  // Do something here
}
public static List<int> GetDataIds(Guid userId, int iNumberOfItems)
{
  var result = GetData(userID, 0);

  return (from r in result select c.id).Take(iNumberOfItems).ToList<int>();
}

用法:

List<int> ids = GetDataIds(userID, 10);

您也可以使用相同的方法名称,但添加参数:

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

  return (from r in result select c.id).Take(iNumberOfItems).ToList<int>();
}

用法:

List<int> ids = GetData(userID, 0, 10);

扩展方法

此外,您还可以扩展List<SomeDTO>,以便在已有填充List<SomeDTO>类型的列表时直接调用它:

public static List<int> GetDataIds(this List<SomeDTO> data, Guid userId, int iNumberOfItems)
{
  return (from r in data select c.id).Take(iNumberOfItems).ToList<int>();
}

然后你可以像这样使用它:

List<SomeDTO> result = GetData(userID, 0);

// do other stuff here using other aspects of the result...

List<int> ids = result.GetDataIds(userID, 10);

答案 5 :(得分:0)

正如PaulB所说,这是因为在重载时,返回类型不是签名的一部分。它将两个函数视为:

public static List<SomeDTO> GetData(Guid userId, int languageId) -> GetData(Guid, int)
public static List<int> GetData(Guid userId, int iNumberOfItems) -> GetData(Guid, int)