本帖最后由 stonefeng 于 2014-06-08 18:02:35 编辑

解决方案 »

  1.   

    AsyncDelegate ad2 = new AsyncDelegate(someMethod2);
    IAsyncResult ar2 = ad2.BeginInvoke(1, null, null);
      

  2.   

    估计是这个原因,委托声明的不是方法而是类,而类区分的只有类名。
    delegate void AsyncDelegate(int i, string s) ;  // line 1
    delegate void AsyncDelegate(int i) ;  // line2 这是声明了两个相同的类,会忽视后面的类ps(我试过,后面AsyncDelegate ad1 = new AsyncDelegate()只能接受2个参数的方法,也就是(int ,string))。这是个人浅显的理解,不知道对不对。
      

  3.   

    你从哪个书上看到过delegate void AsyncDelegate(int i, string s) ;  // line 1
    delegate void AsyncDelegate(int i) ;  // line2这种代码能够编译通过?你编出c#编译器根本就会报错、根本不让你编译通过的这个代码来说c#怎么怎么地,是何用意呢?
      

  4.   

    c#编译器给你的错误说得很清楚,根本不能同时存在两个都叫做 AsyncDelegate 的class。纠结参数个数干什么呢?
      

  5.   

    哥们儿:用意不用意的不跟你讨论,我也不想讨论这个。我只想讨论这个语法现象,而且是我在实际代码中的困惑。
    如果你说这是个类,为何不用class来定义?而用delegate?说明delegate是一种特殊的东西,可以作为方法指针(或者说引用)。那么在实际应用中,我需要定义两个不同的方法,并且异步调用。假如定义一个可以通过,为何不能定义第二个?有人说名称想通了就不能声明第二个,那么我实际需要第二个又怎么办?按照一般的思维,即使是按照类来定义,那么换个名字总可以定义第二个吧?但问题是,换个名字就不是异步的了,就要用别的语法。这让人怎么理解呢?只能说这种语法在同一个变量范围内,只能使用一次,这是一种限制!那么我觉得这样的语法是失败的。声明,没说C#是失败的,c#有很多好的地方,就事论事,不想打架,我也是C#程序员。有问题就该讨论,不要急着否认,讨论出个结果就是进步,否则C#为何还要升级版本的?
      

  6.   

    delegate 的确最后实现的方法是以类的方法实现的。
    如果写成类,很长的,而且固定的模式,所以由编译器完成就可以了,是一种简化应该是。
    c#中有object类型。所以如果一个函数可以传一个参数object,
    那么他其实就等于可以传任意个,任意类型的参数。
    你的问题可以处理一下参数要么另定义一个类型,
    复杂一点可以定义成object。
      

  7.   

    delegate声明一个类型,不能出现两个同名类型再正常不过,哪里“乱”了?
      

  8.   

    这位兄弟,恳请你仔细看我在5楼的话。
    关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。
    举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。
      

  9.   

    这位兄弟,恳请你仔细看我在5楼的话。
    关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。
    举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。
    你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。
      

  10.   

    这位兄弟,恳请你仔细看我在5楼的话。
    关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。
    举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。
    你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。
    我要是不用这个名字,就不让我异步,我就得改用别的语法。
      

  11.   

    这位兄弟,恳请你仔细看我在5楼的话。
    关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。
    举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。
    你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。
    我要是不用这个名字,就不让我异步,我就得改用别的语法。
    代码都是人写的,谁阻止你调用BeginInvoke了?还是说你用了别人的类库,而别人只接受特定的委托签名?事情讲清楚,还能做朋友。
      

  12.   

            delegate void AsyncDelegate<parameterType1, parameterType2>(parameterType1 value1, parameterType2 value2);  // line 1
            delegate void AsyncDelegate<parameterType>(parameterType value);
            static void someMethod1(int i, string s) { }
            static void someMethod2(int i) { }            AsyncDelegate<int, string> ad1 = someMethod1;
                IAsyncResult ar1 = ad1.BeginInvoke(1, "str", null, null);
                AsyncDelegate<int> ad2 = someMethod2;
                IAsyncResult ar2 = ad2.BeginInvoke(1, null, null);
      

  13.   

    这位兄弟,恳请你仔细看我在5楼的话。
    关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。
    举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。
    你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。
    我要是不用这个名字,就不让我异步,我就得改用别的语法。
    代码都是人写的,谁阻止你调用BeginInvoke了?还是说你用了别人的类库,而别人只接受特定的委托签名?事情讲清楚,还能做朋友。
    我刚才没说清,我说不让异步的意思是换个名字的话,就没有了异步的能力,而且语法出错。这位兄台解决了我的疑问,刚刚试过,可以了。
    之前说“乱”,看来有些鲁莽,还是没有想到的个异步代理如何用泛型来解决,现在对觉得“乱”字不爽的朋友表示歉意。
    帖子加分到100,回馈大家,谢谢!