为 .NET 4 编写的代码为 .NET 3.5 客户端返回错误
Code Written for .NET 4 returning Error For .NET 3.5 Client
我正在尝试获取一个为 .NET 4 编码的库并重新编译它以使用 .NET 3.5 客户端。该图书馆位于 https://github.com/cshivers/IrcClient-csharp/tree/master/IrcClient-csharp
这是我程序中的代码块,在调用外部库中的 Irc.ChannelMessage 时出错。
Private Sub irc_ChannelMessage(Channel As String, User As String, Message As String) Handles irc.ChannelMessage
rtbOutput.Clear()
rtbOutput.Text = Message
If rtbOutput.Text.StartsWith("!Listen ") Then
Dim s As String = rtbOutput.Text
Dim pars As New List(Of String)(s.Split(" "c))
CheckParams(pars)
End If
End Sub
当我的程序设置为使用 .NET 4 时,该库适用于我的程序,但是当我将它设置为使用 .Net 3.5 客户端时,它 returns 下面的错误
Error 4 Method 'Private Sub irc_ChannelMessage(Channel As String, User
As String, Message As String)' cannot handle event 'Public Event
ChannelMessage(sender As Object, e As
TechLifeForum.ChannelMessageEventArgs)' because they do not have a
compatible signature.
似乎一旦我为 .NET 3.5 编译它,IrcClient.cs 就无法将它正确地转换为 EventArguments.cs...
在 IrcClient.cs 我们正在调用
public event EventHandler<ChannelMessageEventArgs> ChannelMessage = delegate { };
然后应该从 EventArguments.cs:
调用 This
public class ChannelMessageEventArgs : EventArgs
{
public string Channel { get; internal set; }
public string From { get; internal set; }
public string Message { get; internal set; }
public ChannelMessageEventArgs(string Channel, string From, string Message)
{
this.Channel = Channel;
this.From = From;
this.Message = Message;
}
}
但是它只能在 .NET 4 中工作吗?
设置事件处理程序(Handles
关键字)时,方法的签名(换句话说,传递给方法的变量)必须与事件的签名匹配。
您的活动签名是 (C#):
EventHandler<ChannelMessageEventArgs> ChannelMessage
(vb.net):
EventHandler(EventArgs as ChannelMessageEventArgs)
您正在错误地尝试使用以下签名处理此事件:
irc_ChannelMessage(Channel As String, User As String, Message As String)
这三个变量包含在 ChannelMessageEventArgs class 中,并一起传递,因此您可以将事件处理方法更改为:
Private Sub irc_ChannelMessage(EventArgs As ChannelMessageEventArgs) Handles irc.ChannelMessage
rtbOutput.Clear()
rtbOutput.Text = EventArgs.Message
If rtbOutput.Text.StartsWith("!Listen ") Then
Dim s As String = rtbOutput.Text
Dim pars As New List(Of String)(s.Split(" "c))
CheckParams(pars)
End If
End Sub
我正在尝试获取一个为 .NET 4 编码的库并重新编译它以使用 .NET 3.5 客户端。该图书馆位于 https://github.com/cshivers/IrcClient-csharp/tree/master/IrcClient-csharp
这是我程序中的代码块,在调用外部库中的 Irc.ChannelMessage 时出错。
Private Sub irc_ChannelMessage(Channel As String, User As String, Message As String) Handles irc.ChannelMessage
rtbOutput.Clear()
rtbOutput.Text = Message
If rtbOutput.Text.StartsWith("!Listen ") Then
Dim s As String = rtbOutput.Text
Dim pars As New List(Of String)(s.Split(" "c))
CheckParams(pars)
End If
End Sub
当我的程序设置为使用 .NET 4 时,该库适用于我的程序,但是当我将它设置为使用 .Net 3.5 客户端时,它 returns 下面的错误
Error 4 Method 'Private Sub irc_ChannelMessage(Channel As String, User As String, Message As String)' cannot handle event 'Public Event ChannelMessage(sender As Object, e As TechLifeForum.ChannelMessageEventArgs)' because they do not have a compatible signature.
似乎一旦我为 .NET 3.5 编译它,IrcClient.cs 就无法将它正确地转换为 EventArguments.cs...
在 IrcClient.cs 我们正在调用
public event EventHandler<ChannelMessageEventArgs> ChannelMessage = delegate { };
然后应该从 EventArguments.cs:
调用 Thispublic class ChannelMessageEventArgs : EventArgs
{
public string Channel { get; internal set; }
public string From { get; internal set; }
public string Message { get; internal set; }
public ChannelMessageEventArgs(string Channel, string From, string Message)
{
this.Channel = Channel;
this.From = From;
this.Message = Message;
}
}
但是它只能在 .NET 4 中工作吗?
设置事件处理程序(Handles
关键字)时,方法的签名(换句话说,传递给方法的变量)必须与事件的签名匹配。
您的活动签名是 (C#):
EventHandler<ChannelMessageEventArgs> ChannelMessage
(vb.net):
EventHandler(EventArgs as ChannelMessageEventArgs)
您正在错误地尝试使用以下签名处理此事件:
irc_ChannelMessage(Channel As String, User As String, Message As String)
这三个变量包含在 ChannelMessageEventArgs class 中,并一起传递,因此您可以将事件处理方法更改为:
Private Sub irc_ChannelMessage(EventArgs As ChannelMessageEventArgs) Handles irc.ChannelMessage
rtbOutput.Clear()
rtbOutput.Text = EventArgs.Message
If rtbOutput.Text.StartsWith("!Listen ") Then
Dim s As String = rtbOutput.Text
Dim pars As New List(Of String)(s.Split(" "c))
CheckParams(pars)
End If
End Sub