C#中Packet接口含Write方法却触发CS1061访问错误
解决CS1061错误:'Packet' 不包含 'Write' 定义
你遇到的问题是命名冲突导致的:泛型类PacketCodec<Packet>的泛型参数名Packet,和你定义的Network.Packets.Packet接口完全同名。编译器会把这个泛型参数视为一个未约束的未知类型,而非你写的带Write方法的接口,自然找不到对应的方法。
修复方案
重命名泛型参数避免冲突
把泛型类的类型参数从Packet改为其他名称(比如TPacket),消除与接口名的混淆。添加泛型约束
给泛型参数加上约束,指定它必须实现Network.Packets.Packet接口,让编译器明确该类型拥有Read和Write方法。
修改后的PacketCodec代码
using System.Collections.Generic; using DotNetty.Buffers; using DotNetty.Codecs; using DotNetty.Transport.Channels; using Network.Packets; using Network.Protocols; namespace Network.Codecs { // 泛型参数改为TPacket,并添加接口约束 public class PacketCodec<TPacket> : ByteToMessageCodec<TPacket> where TPacket : Packet { public static DataSerializer CreateDataSerializer(IByteBuffer buf) => new DataSerializer(buf); private Client client; public PacketCodec(Client client) { this.client = client; } protected override void Encode(IChannelHandlerContext context, TPacket packet, IByteBuffer output) { int? id = ProtocolRegistry.GetPacketID(this.client.connection.GetProtocol().GetState(), packet.GetType(), false); if (id == null || id < 0) { throw new System.IO.IOException("Unknown packet (" + packet.GetType().Name + ")"); } else { DataSerializer serializer = CreateDataSerializer(output); serializer.WriteVarInt(id.Value); packet.Write(serializer); // 现在编译器可正常识别Write方法 } } protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> output) { // 可在此实现解码逻辑 } } }
注:你代码中标注serializer.WriteVarInt(id.Value);处的报错提示,实际错误根源是泛型参数的命名冲突,修改后该语句也会正常工作(前提是DataSerializer类确实包含WriteVarInt方法)。
内容的提问来源于stack exchange,提问作者fladon
相关产品推荐
相关产品推荐

