【问题标题】:Why does constructor turn to method when brackets added?为什么添加括号时构造函数会转向方法?
【发布时间】:2015-11-24 22:01:31
【问题描述】:

我正在编写一个类,每当我开始编写构造函数时,文本变为蓝色,表示它与类相关,但是,一旦我为参数添加 () 括号,它就会变成黑色,就好像它是正常的一样方法和编译器抱怨它需要一个返回类型。

这里是主要形式:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Kat 
{
public partial class Form1 : Form
{
    Cat[] catArray = new Cat[7];

    catArray[0] = new Cat("Tom", "Tiger", "India", 'm', 10);
    Cat tiger2 = new Cat("Kyle", "Tiger", "India", 'm', 4);


    public Form1()
    {
        InitializeComponent();
    }
}
}

这是课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kat
{
class Cat
{
    private string _name, _species, _country;
    private char _gender;
    private int _age;

    public Cat(string name, string species, string country, char gender, int age)
    {
        _name = name;
        _species = species;
        _country = country;
        _gender = gender;
        _age = age;
    }
}
}

而且它肯定不起作用,因为我不能用它来构造一个对象。这是来自我的 IDE 的精确副本,它位于主类的命名空间中。

主类的错误是: “错误 3 方法必须有返回类型” 和 “错误 1 ​​数组大小无法在变量声明中指定(尝试使用‘新’表达式进行初始化)” 和 “错误 8 'Kat.Form1.catArray' 是一个'字段',但用作'类型'” 和 “错误 10 找不到类型或命名空间名称 'tiger1'(是否缺少 using 指令或程序集引用?)”

错误更多,但或多或​​少是重复的。

如果你用传统的“Cattiger1 = ...”创建对象,它似乎会实例化,但是当你尝试将它放入数组时,错误确实出现了。

【问题讨论】:

  • 确切的错误信息是什么?
  • 它对我来说很好,但我要补充一点,默认的空构造函数是多余的,除非你还指定了一个参数化的构造函数。是否出现编译错误?
  • 如果代码无法编译,请尝试重启 VS,有时它会报错,快速重启会将其唤醒。
  • 确保您的代码中的拼写 大小写相同,我假设您上面的代码不是从您的 IDE 复制/粘贴的。
  • 是否在命名空间中?

标签: c# class constructor


【解决方案1】:

您在方法之外有非初始化代码:

public partial class Form1 : Form
{
    Cat[] catArray = new Cat[7];

    catArray[0] = new Cat("Tom", "Tiger", "India", 'm', 10);  // not legal
    Cat tiger2 = new Cat("Kyle", "Tiger", "India", 'm', 4);


    public Form1()
    {
        InitializeComponent();
    }
}

将其放入表单的构造函数中:

public partial class Form1 : Form
{
    Cat[] catArray = new Cat[7];

    Cat tiger2 = new Cat("Kyle", "Tiger", "India", 'm', 4);


    public Form1()
    {
        catArray[0] = new Cat("Tom", "Tiger", "India", 'm', 10);
        InitializeComponent();
    }
}

编译器用来解析代码的算法被我的无效语法绊倒了,无法准确描述真正的问题是什么。

【讨论】:

    【解决方案2】:

    注意以下几点:

    1. 构造函数必须与封闭类(结构)具有完全相同的名称,并且不能有返回类型。
    2. 方法的名称必须与类(结构)的名称不同,并且必须包含返回类型(可以是void或普通类型)。

    如果您尝试在上述 1. 和 2. 之间进行混合,则会收到编译时错误。

    当你开始输入时:

    public Cat
    

    开发环境 (Visual Studio) 会认为 Cat 是方法、属性或字段的类型。当您继续使用空格和该成员的名称时,就会发生这种情况。相反,当您继续使用左括号时:

    public Cat(
    

    开发环境意识到这必须是一个构造函数(没有类型,只有成员名称),因此它更改为用于成员的颜色,而不是用于成员的类型的颜色.


    我现在在您的问题中看到了更多详细信息。你有:

    public partial class Form1 : Form
    {
      Cat[] catArray = new Cat[7];
    
      catArray[0] = new Cat("Tom", "Tiger", "India", 'm', 10);
    

    这两行中的最后一行是非法的。您不能直接在这样的类中进行数组条目分配。考虑将其移至构造函数主体:public Form1() { catArray[0] = ... }

    【讨论】:

    • 这如何回答这个问题?为什么这得到了赞成?
    • @SethKitchen 我没想到他在班级成员级别拥有catArray[0] = ... 的东西。我对此添加了一条评论,但 D Stanley 更快。也许我被投票了,因为我解释了输入(时文本颜色变化的部分。
    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2011-08-30
    • 2020-05-09
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多