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#上解决了!
答案 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)