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

C# 如何处理重载方法签名中的冲突?,c#,overloading,conflict,method-signature,C#,Overloading,Conflict,Method Signature,我有一种感觉,这个问题是一堆虫子,但我无论如何都要问…:) 我有一个方法: private MembershipUser GetUserFromReader(SqlDataReader reader) 我希望使用不同的返回类型重载此方法: private User GetUserFromReader(SqlDataReader reader) 但是编译器抱怨这两个方法具有相同的签名 那么,最好的方法是什么呢?我不想添加不必要的内容 参数仅用于更改方法签名 我一直在考虑这样做: private

我有一种感觉,这个问题是一堆虫子,但我无论如何都要问…:)

我有一个方法:

private MembershipUser GetUserFromReader(SqlDataReader reader)
我希望使用不同的返回类型重载此方法:

private User GetUserFromReader(SqlDataReader reader)
但是编译器抱怨这两个方法具有相同的签名

那么,最好的方法是什么呢?我不想添加不必要的内容 参数仅用于更改方法签名

我一直在考虑这样做:

private User GetUserFromReader(T reader)
但我还没有完全探究这一点。看来我需要做个决定 我使用reader对象的方式有很多变化

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


感谢您的帮助…

您不能在过载时更改返回类型。编译器应该如何告诉您要使用哪一个

您应该做的是返回一个公共超类,它包含您可能想要返回的所有内容,然后只返回任何适用的内容


要么这样,要么对方法进行不同的命名,因为它们显然做了不同的事情。

您唯一的实际选择是:

  • 更改函数的名称
  • 更改函数的签名
  • 我讨厌陈词滥调,但没有办法绕过仅按返回类型区分方法的限制


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

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


    唯一真正的选择(即,不包括添加“伪”参数)是调用一个方法GetMembershipUserFromReader和另一个方法GetUserFromReader,为什么要重载它?为什么不让方法说出它的作用,就像这样:

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

    如果确实希望区分返回类型,但使用相同的方法签名,则可以使用泛型:

    private T GetUserFromReader<T>(SqlDataReader reader)
    
    private T GetUserFromReader(SqlDataReader)
    

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

    有什么理由不能重命名私有方法吗?这并不是说它会影响你的类的外部用户——毕竟它是私有的。是的,我同意。我的回答是:)非常感谢。当我使用公共方法遇到同样的情况时,我会尝试一下。在这种情况下,因为它是私人的,我同意卢曼的答案是最好的解决方案。谢谢。当我问这个问题时,我并没有真正考虑可访问性。我认为这是最好的解决方案,因为它是“私有的”;CLR允许重载仅按返回类型不同。签名匹配的C#规则和CLR规则之间有许多细微的区别;这是最明显的一个。@Eric:你知道为什么在CLR中实现这一点吗?我认为这在C#的某些情况下可能有用,但我的同事不同意我的观点。但对我来说,在不含糊的地方重载返回类型是有意义的。你觉得Eric怎么样?@Joan:在MSIL语言中没有“重载解析”这样的东西。每个方法(或虚拟方法槽)都有一个唯一的“令牌”,方法调用几乎就是“调用与该令牌关联的方法”。由于不需要基于参数进行重载解析,因此返回类型可以是签名的一部分。