none
单独开一贴,个人认为是编译器缺陷,希望有人提交给微软。 RRS feed

  • 常规讨论

  • 原帖:http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/dca2b1fb-1684-49d7-ad4e-ef69a42ef711

    原帖我搞的比较乱,为了大家方便阅读,单独开一贴
    发此贴的目的就是让大家看看这个算不算 BUG。

    public class MyClass

    {
        void MyMethod(params string[] values) { }   //
    非静态的(形参 System.String
        static void MyMethod(object value) { }      // 静态的(形参 System.Object

        static void Main()
        {
            MyClass.MyMethod("
    就此行代码编译错误!"); // 用类名调用方法,明显的指定了是静态方法
        }

    }

    // 上述代码,很明显 C# 编译器编译的时候,对重载时没有判断方法代码的具体上下文,照成错误的结果。
    // 上述代码是编译器最典型错误案例,实际项目中 C# 编译器对重载方法定位不是太准确。

    希望有人能向微软提交这个错误(本人试着提交过,又要填这个填那个的,太麻烦了)

    2012年3月9日 8:47

全部回复

  • 您好,
    因為您傳入的參數是string,所以會用到
    voidMyMethod(paramsstring[] values)

    所以就會發生錯誤呀!

    請改成

    MyClass.MyMethod("就此行代码编译错误!" as object );

    or

    //static void MyMethod(object value) { }
    static void MyMethod(string value) { }

     



    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月9日 8:55
  • 您好,
    因為您傳入的參數是string,所以會用到
    voidMyMethod(paramsstring[] values)

    所以就會發生錯誤呀!

    請改成

    MyClass.MyMethod("就此行代码编译错误!" as object );

    or

    //static void MyMethod(object value) { }
    static void MyMethod(string value) { }



    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    我靠!真受不了你,怎么排除上面示例的错误,要你教吗?是人都知道!
    认真看我描述的问题,上面我已经说过了“最典型案例”,C# 编译器编译代码时对重载方法仅仅判断方法签名的,不判断代码其它上下信息,这样存在缺陷或不足。

    上述例子,只是一个友好的、简单的、一眼就能看出来问题的例子!
    实际开发会出现很复杂情形,绝对不是 (string)value 或 value as string 能解决的。

    我曾今写过一个很经典的方法(若干重载),这个方法现在找不到了(否则我就贴出来了),为什么说这个方法经典呢?因为无法调用这些方法,我的同事们绞尽脑汁尝试任何方式的调用,结果只有一个:二义性,编译错误!

    2012年3月10日 3:13
  • 您好,Sorry! 小弟沒有看仔細您的問題,請見諒!

    這個問題真有趣!

    小弟有上connect.microsoft.com跟MS反應!

    https://connect.microsoft.com/VisualStudio/feedback/details/730515/use-static-method-but-vs-net-will-use-non-static-method-when-have-the-same-method-name


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年3月10日 14:52