【问题标题】:Declaring Main as Static Throws Errors [closed]将 Main 声明为静态会引发错误 [关闭]
【发布时间】:2014-02-01 13:17:54
【问题描述】:

在我上次编译时,我收到以下构建错误:

"非静态字段、方法或 属性...”

然后是我的Main() 中包含的所有项目的列表。

以前,它显示为static Main() {,但直到我将其更改为public Main() {,我才能消除错误。

我不记得在这开始发生之前我做的最后一件事(这是昨晚深夜),但我确实相信我在尝试引用主表单上的字段项目时 static void recalcTotals() 搞砸了 - 我仍然没有弄清楚,但这是一个单独的问题。

请注意,这是我的第一个 C# 程序。下面基本上是我的代码:

namespace Play_XXX
{
    public partial class Main : Form 
    {
        // Enable moveability
        private const int WM_NCHITTEST = 0x84;
        private const int HTCLIENT = 0x1;
        private const int HTCAPTION = 0x2;

        // Handling the window messages
        protected override void WndProc(ref Message message) {
            base.WndProc(ref message);

            if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
                message.Result = (IntPtr)HTCAPTION;
        }

        public Main() {
            InitializeComponent();

            // Handle all auto-formatting textboxes
            txt1.Leave += new EventHandler(validateInput);
            txt2.Leave += new EventHandler(validateInput);
            txt3.Leave += new EventHandler(validateInput);
            txt4.Leave += new EventHandler(validateInput);
            txt5.Leave += new EventHandler(validateInput);
            txt6.Leave += new EventHandler(validateInput);
            txt7.Leave += new EventHandler(validateInput);
            txt8.Leave += new EventHandler(validateInput);
            txt9.Leave += new EventHandler(validateInput);
            txt10.Leave += new EventHandler(validateInput);
            txt11.Leave += new EventHandler(validateInput);
        }

        private void Main_Load(object sender, EventArgs e) {
            //TODO: Reference function to clear all input forms
        }

        static decimal? trueAmount(string testValue) {
            decimal preOut;

            //TODO: RegEx to remove all except digits?
            if (testValue != null && testValue != "")
                testValue = testValue.Replace(",", "").Replace("$", "");
            else
                testValue = "0";

            //Return value
            if (decimal.TryParse(testValue, out preOut))
                return preOut;
            else
                return null;
        }

        void validateInput(object sender, EventArgs e) {
            TextBox subjBox = (sender as TextBox);

            decimal? trueVal = trueAmount(subjBox.Text);

            //Check if this is a number
            if (trueVal.HasValue) {
                subjBox.Text = trueVal.Value.ToString("C");
                subjBox.BackColor = Color.FromArgb(86, 86, 86);
                subjBox.ForeColor = Color.FromArgb(208, 210, 211);
                recalcTotals();
            }
            else {
                subjBox.BackColor = Color.FromArgb(255, 200, 200);
                subjBox.ForeColor = Color.Maroon;
            }
        }

        static void recalcTotals() {
            //TODO: How the fxck do your reference form controls
        }

        private void btnClose_Click(object sender, EventArgs e) {
            Close();
        }

    }
}

【问题讨论】:

  • 而错误发生在哪一行?看起来这个错误是不言自明的。
  • 首先要了解:编译时错误和异常(在执行时抛出)是非常非常不同的。接下来,您需要将您的类从Main 重命名为其他名称,因为您需要一个名为Main 的静态方法 作为入口点。我还强烈建议您在开始编写 GUI 之前尝试使用简单的控制台应用程序来掌握 C# 语言的核心部分。
  • main 上的返回类型是否需要 void?静态无效主要?另外 validateInput 看起来可能缺少静态减速。
  • @tnw Main() 内的每一行都会出现错误。我试图弄清楚为什么在使用Main() 作为static 创建程序时突然发生这种情况。
  • 请不要使用Main 来表示可执行文件的入口点以外的任何内容。如果你这样做,你只是在自找麻烦。

标签: c# class main static-methods


【解决方案1】:

将您的班级命名为 Main 以外的所有名称(例如 MainForm)。

【讨论】:

  • @jon-skeet 我将Main() 类重命名为Default(),然后它继续为我重命名了所有内容(Main() 的其他实例)。我仍然收到相同的错误。 :(
  • 第一:类名没有括号。第二:当您遇到名称冲突时应用“重命名”重构会搞砸。在这种情况下,您必须手动完成。
  • 谢谢。我去发现每次出现手动更改它们。它仍然给出错误,所以我创建了一个新项目来查看默认情况下它的外观,生成的Main() 实际上默认情况下是public。我现在就这样吧,但我的理解是主类中的Main()不应该是公开的。
  • @Rawrcasm:Main 方法是可执行文件的静态入口点,您可以根据需要设置为公共的或私有的。我一般更喜欢私人的。
【解决方案2】:

请注意,构造函数看起来与方法不同。

一个方法有一个不同于类名的名字,它有一个返回类型,例如voidint。这些是方法:

class C
{
  public void M1()
  {
  }
  public static void M2()
  {
  }
  public int M3()
  {
    return 10;
  }
  public static int M4()
  {
    return -10;
  }
}

构造函数必须与类同名,并且不能有返回类型。这些是构造函数:

class C
{
  public C()
  {
  }
  static C()
  {
  }
}

构造函数通常用于在使用类之前设置“状态”。

入口点是一种特殊的方法,在程序中只能有一个入口点。入口点必须是一个方法,它必须是static,并且必须命名为Main。因此,入口点不能是也称为Main 的类的直接成员。

我认为在 Windows 窗体应用程序中通常不会在派生自 Form 的类中包含入口点,但如果命名符合上述规定,这肯定是可能的。

此外,非静态构造函数或方法可以直接访问类的所有成员。当另一个非静态成员被这样引用时,与方法/构造函数所属的类的同一实例(称为this)被隐式用于访问另一个成员。

相比之下,static 构造函数或方法只能通过显式拥有实例来访问非静态成员,如myInstance.TheNonStaticMember();。通常,入口点,也就是我所说的static 方法,将使用new TheClassName(...) 创建一个实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2018-05-15
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多