如何处理重载方法签名中的冲突?

时间:2010-02-10 22:52:48

标签: c# overloading conflict method-signature

我有一种感觉,这个问题是一堆蠕虫,但无论如何我都会问......:)

我有一个方法:

private MembershipUser GetUserFromReader(SqlDataReader reader)

我希望使用不同的返回类型重载此方法:

private User GetUserFromReader(SqlDataReader reader)

但编译器抱怨这两种方法具有相同的签名。

那么,最好的方法是什么?我宁愿不添加不必要的 参数只是为了改变方法签名。

我玩过这样的想法:

private User GetUserFromReader(T reader)

但还没有完全探索过这个。好像我需要做一个 一堆变化与我如何使用我的读者对象。

有什么想法吗?当你有两个超载时,最佳做法是什么 相同签名的方法?

感谢您帮忙...

5 个答案:

答案 0 :(得分:6)

为什么要超载?为什么不让方法说出它的作用,如下:

private MembershipUser GetMembershipUserFromReader(SqlDataReader reader)
private User GetUserFromReader(SqlDataReader reader)

答案 1 :(得分:5)

如果您真的想要区分返回类型,但使用相同的方法签名,则可以使用泛型:

private T GetUserFromReader<T>(SqlDataReader reader)

但是重命名这些方法要简单得多,就像Luhmann的回答一样。

答案 2 :(得分:2)

您唯一真正的选择是:

  1. 更改功能名称
  2. 更改功能的签名
  3. 我讨厌陈腐,但并不是一种解决方法,只能通过返回类型区分方法。

    如果在父类中声明了其中一个重载,那么您可以使用new关键字来“隐藏”来自调用者的更高方法,但通常会考虑new(在成员声明上)恶

答案 3 :(得分:1)

您无法在重载时更改返回类型。如何编译器告诉您要使用哪一个?

你应该做的是返回你想要返回的所有东西的共同超类,然后只返回适用的东西。

要么是这样,要么以不同的方式命名方法,因为它们显然做了不同的事情。

答案 4 :(得分:1)

简单的答案是,就C#而言,你不能。允许通过返回类型重载(我认为),而不是C#。

唯一真正的选择(即,不包括添加“虚拟”参数),是调用一个方法GetMembershipUserFromReader和另一个GetUserFromReader