首先谢谢各位,在以下例子中,
怎样理解“Socket listener = (Socket)ar.AsyncState”,将对象转换成接口吗?
我们知道ocket 是一个实现了伯克利的套接字接口,而AsyncState为IAsyncResult的一个属性,是object类型,很奇怪哦~
        public void OnConnectRequest(IAsyncResult ar)
        {
            // 获取客户请求的socket
            Socket listener = (Socket)ar.AsyncState;
            //返回新的socket对象,用来向远程主机发送数据和从远程主机接收数据
            Socket sConn = listener.EndAccept(ar);
            NewConnection(sConn);            //远程终端的网络地址和端口号
            string s = sConn.RemoteEndPoint.ToString();
            AddClientToListBox(s);
            listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
        }   

解决方案 »

  1.   

    正因为它是一个object类型,如果不做强制类型转换,没办法传给Socket类型。本质上说,强制类型转换只是绕过了编译器的类型检查——编译器不允许不同类型的变量赋值。强制类型转换就是告诉编译器让它放行。至于这个object是否真的是Socket,运行期间才知道。
      

  2.   

    谢谢版主关照,解释得非常透彻,还望再次解答:
    AsyncState(Object类型)是IAsyncResult接口的一个属性。
    而Socket属于一个不同的接口,两个接口可以这样操作,如何实现的呢?
    Socket listener = (Socket)ar.AsyncState
      

  3.   

    想明白了,Socket只是一个实现了 Berkeley 套接字接口的类,将AsyncState这个对象转换为Socket类型是没错的
      

  4.   

    跟什么“Berkeley 套接字接口的类”没有直接的关系。如果你传递的参数是 ABC 类型的,你就可以写ABC myParam = (ABC)ar.AsyncState; 这就是.net framework的设计者不知道你要传递什么方法,而且那是13年前设计的功能,那时候也没有什么泛型,因此设计者给 IAsyncResult 类型设计了一个 object 类型的属性,让你用来传递参数。
      

  5.   

    这就是.net framework的设计者不知道你要传递什么方法 -->  这就是.net framework的设计者不知道你要传递什么类型的参数