我对自己正在做的事情有一个非常基本的了解。因此,我正在学习有关 C# 聊天应用程序的教程,但有 2 个类完全相同;虽然代码在 ChatClient 上运行完全正常,但它甚至无法在 ChatServer 上编译。这怎么可能?
编译器说=> CS7036:没有给出与所需参数相对应的参数
说明:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ChatClient.Net.IO
{
class PacketBuilder
{
MemoryStream ms;
public PacketBuilder()
{
ms = new MemoryStream();
}
public void WriteOpCode ( byte opcode )
{
ms.WriteByte( opcode );
}
public void WriteString ( string msg )
{
var msgLength = msg.Length;
ms.Write(BitConverter.GetBytes(msgLength));
ms.Write(Encoding.ASCII.GetBytes(msg));
}
public byte [] GetPacketBytes ()
{
return ms.ToArray();
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ChatServer.Net.IO
{
class PacketBuilder
{
MemoryStream ms;
public PacketBuilder ()
{
ms = new MemoryStream();
}
public void WriteOpCode ( byte opcode )
{
ms.WriteByte( opcode );
}
public void WriteString ( string msg )
{
var msgLength = msg.Length;
ms.Write( BitConverter.GetBytes( msgLength ) );
ms.Write( Encoding.ASCII.GetBytes( msg ) );
}
public byte [] GetPacketBytes ()
{
return ms.ToArray();
}
}
}
我尝试看看是否有人遇到同样的问题,但找不到答案。预先感谢。
您必须针对比您的客户端更早的 .NET 版本构建您的
ChatServer
代码:
在 .NET Framework 4.8 中,
ms.Write( BitConverter.GetBytes( msgLength ) );
失败,请参阅 https://dotnetfiddle.net/3b2MR2。
在 .NET 8 中成功,请参阅 https://dotnetfiddle.net/Lxrmup。
它成功的原因是,在.NET Core 2.1及更高版本中,添加了新的重载到
MemoryStream.Write()
:
MemoryStream.Write(ReadOnlySpan<Byte>)
使用从缓冲区读取的数据将字节块写入当前流。
由于
byte []
可以隐式转换为 ReadOnlySpan<Byte>
,因此代码可以编译。但是在
.NET Framework 中,唯一可用的重载是:
MemoryStream.Write(byte[] buffer, int offset, int count);
如您所见,offset
和
count
参数是不是可选的,因此您必须传入它们才能在.NET Framework中成功编译。 你甚至可以像这样创建一个扩展方法:
public static class MemoryStreamExtensions
{
public static void Write(this MemoryStream ms, byte[] buffer)
{
ms.Write(buffer, 0, buffer.Length);
}
}
现在您的代码将在两个版本中进行相同的编译,请参阅https://dotnetfiddle.net/ZOEuNF。