2

我看过很多关于通过更改返回类型来重载方法的帖子,但是,下面的程序在理想情况下应该可以正常工作,因为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)or的两难境地public float(int a),并且因为 float 类型的变量可以同时保存整数和浮点值..

4

3 回答 3

12

c# 中没有返回类型重载。如果您忽略了返回值,或者将它分配给了一个对象怎么办?那么哪个重载会被调用?有很多模棱两可的场景,这几乎是不可能实现的。

于 2013-06-08T16:31:48.120 回答
5

不是因为这个,而是因为其他场景。

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

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

而且,这不是一个好习惯。您无法轻易将它们区分开来,因此您可能会导致很多错误。

简而言之:这是可能的,但它是如此,如此不切实际,它永远不会被语言设计者认为是想​​要的[1]

[1]:有趣的旁注,MSIL 允许它。因此,如果您使用ildasm,您可能会获得返回类型重载。主要是因为要在里面调用一个函数,需要这样做:call MyReturnType MyFunc(MyType, MyOtherType)

于 2013-06-08T16:33:51.973 回答
0

说你有

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

然后打电话

foo(1);

或 var x = foo(1);

那么你的意思是被称为哪一个?

试图处理前者意味着编译器必须弄清楚在第一种情况下函数是如何被调用的,第二种是交叉手指时间。

除了语言设计师的 PIA 之外,程序员呢?既然它很容易用 fooInt 和 FooFloat 纠正,为什么有人会选择额外的复杂性(更不用说后期绑定的性能)来支持更有意义的名称?

强大的静态类型语言的全部意义在于在编译时消除这种歧义。

于 2013-06-08T16:48:07.620 回答