具有相同名称和参数但返回类型不同的方法

时间:2013-12-18 13:18:09

标签: c# clr

我想知道为什么以下场景在c#中不起作用。

class a
{
    public  int add(int a, int b)
    {
        return a + b;
    }

    public string add(int c, int d)
    {
         return "String : "+(c + d).ToString();
    }
}

由于以下工作正常(在继承的情况下)

class a
{
    public  int add(int a, int b)
    {
        return a + b;
    }
}

class b : a
{
    public string add(int c, int d)
    {
        return "String : "+(c + d).ToString();

    }
}

如果我正在创建bb.add(1,2)的对象,则返回String:3

n两种情况下两个add方法具有不同的返回类型(我知道对方法重载),但它在继承的情况下工作正常,但不在单个类中。

有人知道原因吗?

6 个答案:

答案 0 :(得分:4)

add中的class a个方法完全含糊不清。名称和参数完全相同。

告诉我,这应该做什么(除了不编译)?

int k = a.add(2, 3); // which one should it call? the string or int return type?

编译器也无法解决这个问题。

答案 1 :(得分:3)

在第一个示例中(两个方法在一个单独的类中),不会发生重载,因为两个方法的签名相同(只有名称和参数类型计数,忽略返回值)。这会导致编译器错误。

在第二个示例中,返回类型string的方法add隐藏了继承的方法。当你有像

这样的东西
a myB = new b();
myB.add(1,2);

然后,即使实际类型是b ,基类的实现也将被称为。对于

b myB = new b();
myB.add(3,4);

调用b的实现(查看myB的变量类型,这很重要!)。

答案 2 :(得分:2)

该方法含糊不清。您不能使用相同的方法名称定义相同的参数。

but it working fine in the case of inheritance but not in single class.

事实并非如此。您的第二个案例隐藏了public int add(int a, int b)实施。

答案 3 :(得分:0)

让我们假设您按以下方式调用该方法:

a.add(1,2);

你打电话给哪一种方法?
如果你不能回答这个问题,你可以确定编译器也不能......

这可以使用继承,因为b.add'隐藏' a.add
编译器现在将通过上下文调用哪个方法 即。

b instance = new b();
b.add(1,2);

肯定会打电话给b&b的方法。那里没有歧义...... 但这仍然不是一个好习惯,你会收到警告:b.add(int,int) hides inherited member use the new keyword if hiding was intended

答案 4 :(得分:0)

我建议这是因为模棱两可的行为。让我们想象一下代码:

class a {
  public  int add(int a, int b) {...}
  public string add(int c, int d) {...}
}

a test = new a();

// What method should be executed? 
// int add(1, 2) or string add(1, 2)?   
a.add(1, 2);

当你有不同的课程说 a b 时,没有这种模棱两可的行为

答案 5 :(得分:0)

当我们调用定义部分首先执行的任何函数时,让我们理解函数执行(int sum = i + y),最后我们需要return语句,因此我们可以说return返回函数的整个定义之后。

这就是为什么如果有两个或多个具有相同名称和相同类型且没有相同功能的函数。然后在调用编译器将如何知道要调用哪一个时参数,因为函数名称和参数是相同的。

<code>
 public int MyFun(int i, int y)
 {
   int sum = i + y
   return sum;
 }
 public string MyFun(int i,int y)
 {
   return "";
 }
</code>

在首先调用时,所有焦点都将放在参数和函数名称上,最后在函数定义完成后我们处理return语句。