C# 使用返回值调用public void和private string方法

C# 使用返回值调用public void和private string方法,c#,winforms,C#,Winforms,在我的应用程序中,我想让我的主formForm1在我的UserControlEmailControl上调用一个方法。下面是我想调用的三种主要方法: public void InitializeConnection(string hostname, int port) { try { _imapClient = new TcpClient(hostname, port); _imapNs = _imapClie

在我的应用程序中,我想让我的主formForm1在我的UserControlEmailControl上调用一个方法。下面是我想调用的三种主要方法:

public void InitializeConnection(string hostname, int port)
    {
        try
        {
            _imapClient = new TcpClient(hostname, port);
            _imapNs = _imapClient.GetStream();
            _imapSw = new StreamWriter(_imapNs);
            _imapSr = new StreamReader(_imapNs);

            label1.Text = "*** Connected ***";
            Response();
        }
        catch (SocketException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
,

为此,我在usercontrol页面上使用了以下命令:

    Form1.getemail += new Form1.sendtoemail(this.sendover);

那么在我的主页上我有

public delegate void sendtoemail(object sender, EventArgs e);
    public event sendtoemail getemail;

完成此操作后,在我的usercontrol页面上,它告诉我sendover匹配委托sendtoemail没有重载,并且我需要一个对象引用。到底是什么引发了错误?

您的方法发送不尊重sendtoemail委托的方法签名:

public delegate void sendtoemail(object sender, EventArgs e); // accepts 2 parameters
代替方法声明:

public void sendover() { // ...
。。。宣布它为

public void sendover(object sender, EventArgs e) { // ...
getemail事件的类型为sendtoemail,因此作为处理程序添加的函数必须与该签名匹配

以下是两种解决方案:

改变

public void sendover()

或改变

Form1.getemail += new Form1.sendtoemail(this.sendover);


第一个解决方案更改sendover的签名以匹配委托类型,第二个解决方案创建了一个具有正确类型的匿名函数来调用sendover。

这看起来很像WinForms…抱歉,现在将更改它。太棒了,因此修复了一个错误。。。但是,它仍然在Form1.getemail下面加了下划线,并表示非静态字段、方法或属性“Form1.getemail”需要对象引用。这意味着Form1是表单的类型,而不是表单的实例。
public void sendover() { // ...
public void sendover(object sender, EventArgs e) { // ...
public void sendover()
public void sendover(object sender, EventArgs e)
Form1.getemail += new Form1.sendtoemail(this.sendover);
Form1.getemail += (s, e) => sendover();