为什么这个继承不起作用?

Geo*_*ton 1 c# inheritance

我有一个派生自TcpClient的类,例如

class ZClient : TcpClient
{
    public byte[] Buffer { get; set; }
    public Queue<byte[]> Queue {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

以及创建TcpClient的方法

...

TcpListener listener = ar.AsyncState as TcpListener;
ZClient client = listener.EndAcceptTcpClient(ar) as ZClient;
Run Code Online (Sandbox Code Playgroud)

当我将通常返回TcpClient的listener.EndAcceptTcpClient(ar)转换为ZClient时,对象'client'为null.我试图做的是非法的吗?

更新:是否可以将ZClient的基类的属性设置为等于通过构造函数传入的TcpClient,以避免必须有一个额外的属性来引用TcpClient?例如

public ZClient(TcpClient client)
{
   base = client;  // I'm aware this doesn't work.
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*thS 6

因为它是倒退的.TcpClient不包含Buffer或Queue,因为它不是ZClient.苹果是水果,但不是所有水果都是苹果.

你需要某种显式转换.您可以提供一个接受TcpClient的ZClient构造函数,或者在TcpClient上提供返回ZClient的扩展方法.这些中的任何一个都可能需要使ZClient成为TcpClient的包装类,而不是ZClient的子类.