2

我有一种感觉,这个问题是一罐蠕虫,但我还是要问...... :)

我有一个方法:

private MembershipUser GetUserFromReader(SqlDataReader reader)

我想用不同的返回类型重载这个方法:

private User GetUserFromReader(SqlDataReader reader)

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

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

我曾想过做类似的事情:

private User GetUserFromReader(T reader)

但还没有真正完全探索过这一点。看来我需要对我使用阅读器对象的方式进行大量更改。

有任何想法吗?当您有两个具有相同签名的重载方法时,最佳实践是什么?

感谢您的帮助...

4

5 回答 5

6

为什么要超载呢?为什么不让方法说明它的作用,就像这样:

private MembershipUser GetMembershipUserFromReader(SqlDataReader reader)
private User GetUserFromReader(SqlDataReader reader)
于 2010-02-10T22:56:14.580 回答
5

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

private T GetUserFromReader<T>(SqlDataReader reader)

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

于 2010-02-10T23:00:37.050 回答
2

你唯一真正的选择是:

  1. 更改函数名称
  2. 更改函数的签名

我讨厌老套,但没有办法绕过仅通过返回类型来区分方法的限制。

如果在父类中声明了其中一个重载,那么您可以使用new关键字向调用者“隐藏”更高的方法,但是new(在成员声明中)通常被认为是邪恶的。

于 2010-02-10T22:55:26.270 回答
1

您不能更改重载的返回类型。编译器应该如何告诉你要使用哪一个?

您应该做的是返回您可能想要返回的所有内容的公共超类,然后返回任何适用的内容。

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

于 2010-02-10T22:55:05.647 回答
1

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

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

于 2010-02-10T22:55:31.727 回答