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

Sri*_*uku 2 c# oop overloading

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

因此,它理想情况下应该调用函数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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*art 12

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


It'*_*ie. 5

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

例如,您知道何时Console.ReadLine()只是等待用户输入?(例如按Enter继续)?嗯,print在这种情况下你可以用你的方法做同样的事情.那应该叫哪个呢?它应该调用float方法吗?它应该调用int方法吗?他们使用时会发生什么vardynamic?泛型?

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

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

所以简而言之:它是可能的,但它是如此,如此不切实际,它永远不会被语言设计者视为通缉[1].

[1]:有趣的旁注,MSIL允许它.因此,如果您使用过ildasm,则可能会出现返回类型重载.主要是因为在其中调用函数,您需要这样做:call MyReturnType MyFunc(MyType, MyOtherType)

  • 看起来像3个简洁的线条击败9行或更多行. (2认同)