C#中,delegate有默认的一个参数的Constructor,参数的类型为delegate指向的类型。如:
private delegate string someString();
private void button3_Click(object sender, System.EventArgs e)
{
int x=10;
someString st=new someString(x.ToString);
Console.WriteLine(st());}
会输出10;
如果将参数显式声明:
private delegate string someString(string ss);
private void button3_Click(object sender, System.EventArgs e)
{
int x=10;
someString st=new someString(x.ToString);
Console.WriteLine(st(x.ToString()));}
或者
private delegate string someString(string ss);
private void button3_Click(object sender, System.EventArgs e)
{
int x=10;
someString st=new someString(x.ToString);
Console.WriteLine(st(10));}原理应该没有发生变化,但是
结果为110,x的值改为100,那么得到1100,即为x*10+x,很奇怪吧?为什么呢?

解决方案 »

  1.   

    把someString给我看一下,再说!
      

  2.   

    someString只是delegate的名称,没有其他意义
      

  3.   

    有意思
    你应该查一下
    int 类的ToString是怎么写的
      

  4.   

    int x=10;
    someString st=new someString(x.ToString);
    Console.WriteLine(st(x.ToString()));
    其实相当于调用了Console.WriteLine(x.ToString(x.ToString()))
    也就是
    10.ToString("10");
    你试试结果是几
      

  5.   

    和代理没关系,其实就是x.ToString(x.ToString());输出什么的问题吧?int x=10;
    x.ToString("10");输出什么,这里"10"是一个格式字符串,要看.net如何定义了
      

  6.   

    好像大致是这样如果format字符串为100,output:110 
                                    1000,output:1010
                                    0000,output:0010
                    0只是占位,而不输出,因此format为10,0被x的值10占位,输出为110
      

  7.   

    原来如楼上所说,
    st是个代理,就等价于x.ToString这个方法,于是st(x.ToString)就是x.ToString(x.ToString());
    而后来的10.ToString(10),由于Int32的ToString方法没有使用整数参数的,所以后面的10也被转换成了字符串,效果也是:10.ToString("10");10.ToString("10");
    调用的是指定格式的字符串转换方法,“10”当成格式控制符来看,第一个“1”由于C#不认识这么个格式控制符,就原样输出,第二个“0”表示输出一个数字,于是“10”被输出。