为什么这种方法会导致异常超载?

时间:2013-06-08 16:26:47

标签: c# oop overloading

我已经看过很多关于通过更改其返回类型来重载方法的帖子,但是,理想情况下,以下程序应该可以正常工作,因为integer类型的变量i只能保存整数值。

因此,理想情况下应调用函数int print(int a)函数,甚至不要查看函数float print(int a),因为它返回一个浮点值,而在main()中,我使用了整数变量保存方法返回的值,整数变量永远不能保存浮点值..

以下代码演示了它→

class temp 
{
    public float print(int a) 
    {
        int l=12.55;
        return l;
    }

    public int print(int a) 
    {
        int p=5;
        return p;
    }
}

class Program 
{
    static void Main(string[] args) 
    {
        temp t=new temp();
        int i=t.print(10);
        A.Read();
    }
}

在其他情况下,我会做这样的事情→

class temp 
{
    public float print(int a) 
    {
        int l=12.55;
        return l;
    }

    public int print(int a) 
    {
        int p=5;
        return p;
    }
}

class Program 
{
    static void Main(string[] args) 
    {
        temp t=new temp();
        float f=t.print(10);
        A.Read();
    }
}

在这里,我接受编译器应该生成错误,因为无论是调用public int(int a)还是public float(int a)都会陷入两难境地,因为float类型的变量可以同时包含整数和浮点值..

3 个答案:

答案 0 :(得分:12)

c#中没有返回类型重载。如果您忽略了返回值或将其分配给Object,该怎么办?然后会调用哪个重载?有这么多模棱两可的场景,这几乎是不可能实现的。

答案 1 :(得分:5)

不是因为这个原因,而是因为其他情况。

例如,您知道何时只是等待用户输入而致电Console.ReadLine()? (例如按回车继续)?嗯,在这种情况下,您可以使用print方法执行相同的操作。那应该叫哪个呢?它应该调用float方法吗?它应该调用int方法吗?使用var时会发生什么? dynamic?泛型?

你可以说它应该在你的情况下编译,因为你没有那样使用它。但是,如果它在类库中呢?如果它通过反射调用怎么办?你不能只花一半的编译时间来检查是否会在没有返回类型的情况下在其他任何地方调用它。

而且,这不是一个好习惯。你不能轻易地将它们区分开来,所以你可能会因此引起很多错误。

简而言之:它是可能,但实际上是如此,如此不切实际,它永远不会被语言设计师 [1] 视为通缉。

[1] :有趣的旁注,MSIL允许它。因此,如果您使用ildasm可以获得返回类型重载。主要是因为要在其中调用函数,您需要执行此操作:call MyReturnType MyFunc(MyType, MyOtherType)

答案 2 :(得分:0)

说你有

int foo(int a){..}
double foo(int a) {...}

然后调用

foo(1);

或var x = foo(1);

那你打算叫哪一个?

尝试应对前者意味着编译器必须弄清楚在第一种情况下如何调用函数,第二种是交叉指针时间。

除了语言设计师的PIA,程序员怎么样?看到它很容易用fooInt和FooFloat纠正,为什么有人会选择额外的复杂程度(更不用说后期绑定的性能)而不是更有意义的名字呢?

强大且静态类型语言的重点是在编译时消除这种歧义。