簡體   English   中英

用返回值調用public void和private字符串方法

[英]Call public void and private string methods with return value

在我的應用程序中,我想讓我的主窗體(Form1)在UserControl(EmailControl)上調用一個方法。 以下是我要調用的三種主要方法:

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);
        }
    }

    public void AuthenticateUser(string username, string password)
    {
        _imapSw.WriteLine("$ LOGIN " + username + " " + password);
        _imapSw.Flush();
        label2.Text = "Logged in";
        Response();
    }

    public string MailCount()
    {
        _imapSw.WriteLine("$ STATUS INBOX (messages)");
        _imapSw.Flush();

        string res = Response();
        Match m = Regex.Match(res, "[0-9]*[0-9]");
        return m.ToString();
    }

為此,我在usercontrol頁面上使用了它:

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

    public void sendover()
    {
        InitializeConnection("hostname", 123);
        AuthenticateUser("username", "password");
        MailCount();
    }

然后在我的主頁上

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

private void Form1_Load(object sender, EventArgs e)
    {
        if (this.getemail != null) 
        {
            this.getemail(this, e);

        }
    }

完成此操作后,在我的usercontrol頁面上,它告訴我“ sendover”匹配委托“ sendtoemail”沒有重載,並且我需要一個對象引用。 到底是什么引發錯誤?

getemail事件的類型為sendtoemail ,因此您添加為處理程序的函數必須與該簽名匹配。

這是兩個解決方案:

更改

public void sendover()

public void sendover(object sender, EventArgs e)

或改變

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

Form1.getemail += (s, e) => sendover();

第一種解決方案更改sendover的簽名以匹配委托類型,第二種解決方案創建具有正確類型的匿名函數,該函數調用sendover。

您的方法sendover不尊重sendtoemail委托的方法簽名:

public delegate void sendtoemail(object sender, EventArgs e); // accepts 2 parameters

代替方法聲明:

public void sendover() { // ...

...聲明為...

public void sendover(object sender, EventArgs e) { // ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM