0

我有这个:

public class ClientSession : TcpClient
{
    public int SessionGUID = 0;
}

在服务器线程的某个地方:

ClientSession client = (ClientSession)tcpListener.AcceptTcpClient(); //cast failure

好的,我知道要这样转换,右侧对象必须是 ClientSession 的实例(可能存储在指向基类的指针中)但是......在这种情况下如何构造 ClientSession?

我不想让 ClientSession 像这样:

public class ClientSession
{
    public int SessionGUID = 0;
    public TcpClient client;
}
4

2 回答 2

0

TcpListener.AcceptTcpClient将返回一个TcpClient对象,仅此而已。对象的类型不能在运行时更改,因此无法进行直接转换(保留对象身份和数据)。

我认为组合(类似于您的上一个代码片段)将是最好的方法。您可以通过实现自定义转换运算符来使用强制转换语法启用转换,但我宁愿建议使用带 a 的构造函数TcpClient

public ClientSession(TcpClient client) { /* ... */ }

所以你可以这样做:

ClientSession client = new ClientSession(tcpListener.AcceptTcpClient());
于 2012-06-26T10:28:26.537 回答
0

所有ClientSession都是类型TcpClient,但不是所有TcpClient类型ClientSessiontcpListener.AcceptTcpClient()返回 的对象TcpClient,不能用作ClientSession。或者,您可以按如下方式调整您的课程,

class ClientSession
{
    public ClientSession(TcpClient client) 
    {
        this.client = client;
    }
    public TcpClient client {get; set;}
    // your stuff here...
}
于 2012-06-26T10:29:30.310 回答