在“Timer”上出现了一个模棱两可的引用错误,可能是指向了“System.Windows.Forms.Timer”和“System.Threading.Timer”之间的引用。

9

我遇到了以下.NET编译时错误:

“Timer” 是 'System.Windows.Forms.Timer' 和 'System.Threading.Timer' 之间的模糊引用。

这是在我添加了一个时钟代码块后发生的。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Security.Cryptography;


namespace SocketClient
{

    public partial class SocketClient : Form
    {
        System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
        NetworkStream serverStream = default(NetworkStream);
        string readData = null;


        public SocketClient()
        {
            InitializeComponent();
            Timer timer = new Timer();
            timer.Tick += new EventHandler(TimerOnTick);
            timer.Interval = 1000;
            timer.Start();
        }

         

        private void TimerOnTick(object sender, EventArgs ea)
        {
            Invalidate();
        }

        protected override void OnPaint(PaintEventArgs pea)
        {
            StringFormat strfmt = new StringFormat();
            strfmt.Alignment = StringAlignment.Far;
            strfmt.LineAlignment = StringAlignment.Far;

            pea.Graphics.DrawString(DateTime.Now.ToString("F"),
            Font, new SolidBrush(ForeColor),
            ClientRectangle, strfmt);

        }

        private void getMessage()
        {
            while (true)
            {
                serverStream = clientSocket.GetStream();
                int buffSize = 0;
                byte[] inStream = new byte[10025];
                buffSize = clientSocket.ReceiveBufferSize;
                serverStream.Read(inStream, 0, buffSize);
                string returndata = System.Text.Encoding.ASCII.GetString(inStream);
                readData = "" + returndata;
                msg();
            }
        }


        private void msg()
        {
            if (this.InvokeRequired)
                this.Invoke(new MethodInvoker(msg));
            else
                textDisplay.Text = textDisplay.Text + Environment.NewLine + " >> " + readData;
        }


        private void buttonConnect_Click(object sender, EventArgs e)
        {
      

            // show the message if no input is enter.
            if (string.IsNullOrEmpty(textName.Text) || string.IsNullOrEmpty(textPort.Text) || string.IsNullOrEmpty(textIP.Text))
            {
                MessageBox.Show("Please enter Name, IP Address & Port #");
            }
            else
            {
                //connect to the server if all 3 input is enter
                readData = "Conected to NYP Server ...";
                msg();
              
                clientSocket.Connect(textIP.Text, Convert.ToInt32(textPort.Text));
                serverStream = clientSocket.GetStream();

                byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textName.Text + "$");
                serverStream.Write(outStream, 0, outStream.Length);
                serverStream.Flush();

                Thread ctThread = new Thread(getMessage);
                ctThread.Start();

             
            }
        }

        private void buttonSend_Click(object sender, EventArgs e)
        {
            // Show msg box if no server is connected
            if (serverStream == null)
            {
                MessageBox.Show("Please connect to a server first!");
                return;
            }

            // Send text
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textSend.Text + "$");
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();

            // Clear text
            textSend.Text = "";

        }

        private void textDisplay_TextChanged(object sender, EventArgs e)
        {
            textDisplay.SelectionStart = textDisplay.Text.Length;
            textDisplay.ScrollToCaret();
            textDisplay.Refresh();
        }

        private void textSend_TextChanged(object sender, EventArgs e)
        {
            buttonSend.Enabled = !string.IsNullOrEmpty(textSend.Text);
        }
    }
}

如果我想避免这个错误,我有哪些选择?

2
请注意,.NET Framework 违反了 .NET Framework 设计准则之一:通用名称的类应该是通用类。考虑 StringXmlTextReaderTimer 是一个通用名称,其中一个或两个类是专门化的。 - Jay Bazuzi
2个回答

32

这里有几种选项:

  • 使用别名:

    using UITimer = System.Windows.Forms.Timer;
    
    ...
    UITimer timer = new UITimer();
    
  • 使用完全限定名称:

  • System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
    
  • 使用命名空间别名:

    using WinForms = System.Windows.Forms;
    ...
    WinForms::Timer timer = new WinForms::Timer();
    
    然而,我个人建议将用户界面代码与网络代码分开 - 在那时,这不太可能成为问题。
    我还要注意的是,您目前正在读取流而没有考虑返回值 - 这是一个糟糕的想法,因为您不知道缓冲区中实际包含多少新数据。

6
问题在于你正在...
using System.Windows.Forms;
using System.Threading;

这两个命名空间都有一个Timer类,编译器无法确定使用哪个。当您声明Timer时,请使用完整名称,例如:

System.Windows.Forms.Timer

或者

System.Threading.Timer

WinForms 计时器类

线程计时器类

根据您的使用情况,我认为您需要使用 System.Windows.Forms.Timer,如下所示:

    public SocketClient() 
    { 
        InitializeComponent(); 
        var timer = new System.Windows.Forms.Timer(); 
        timer.Tick += new EventHandler(TimerOnTick); 
        timer.Interval = 1000; 
        timer.Start(); 
    } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接