1

我得到了 2 个具有相同名称和相同参数类型的方法。我想重载这些,但它不起作用,因为我收到了这个错误:

"<Class-name> already defines a member called 'ChangeProfileInformation' 
 with the same parameter types"

我有这样的事情:

public void ChangeProfileInformation(User user)
{
   a
   b
}

public void ChangeProfileInformation(User user)
{
   a
   c
   d
}

有谁知道为什么这不起作用?

提前致谢!

4

5 回答 5

6

重载意味着使用相同的函数名做不同的事情。对于这两个函数应该有不同的签名,否则编译器无法区分。你必须有不同的签名。

于 2013-05-18T18:26:19.493 回答
5

编译器不知道该选择哪一个:它会怎样?您需要有不同的名称或不同的参数类型。

或者,您为什么不使用可选标志来更改函数的行为呢?

于 2013-05-18T18:21:36.640 回答
1

方法重载意味着相同的方法名称但具有不同的方法签名。Method Signature signifies the Method Name with Input parameters.您确实无法使用相同的方法名称和相同的参数类型来实现方法重载。

您可以从以下站点更好地了解方法重载的详细概念:

http://www.dotnetperls.com/overload

http://cshapindepth.com/Articles/General/Overloading.aspx

于 2013-05-18T18:33:41.153 回答
1

不知道为什么要这样做,但是如果您真的想保持相同的名称,请在其中一种方法中使用一个虚拟参数。

于 2013-05-18T22:29:57.333 回答
1

有点晚了,但有可能(如上所述发布示例代码),我今天遇到了完全相同的情况(构造函数重载,因此无法更改名称)。这是我的做法,小技巧,但它让我将所有相关的 LINQ 谓词放在同一个地方:

public BusinessStructureFilterSpecification(int responsibilityTypeId, bool dummy1 = true) : base(x => x.ResponsibleGroups.Any(x1 => x1.ResponsibilityTypeId == responsibilityTypeId))
{
    AddIncludes();
}

public BusinessStructureFilterSpecification(int userId, string dummy2 = "") : base(x => x.ResponsibleUsers.Any(x1 => x1.UserId == userId))
{
    AddIncludes();
}

现在的诀窍是使用参数名称来调用它们,如下所示:

if (responsibiltyTypeId.HasValue && !userId.HasValue)
    spec = new BusinessStructureFilterSpecification(responsibilityTypeId: responsibiltyTypeId.Value);

if (!responsibiltyTypeId.HasValue && userId.HasValue)
    spec = new BusinessStructureFilterSpecification(userId: userId.Value);
于 2018-11-15T20:44:51.627 回答