类struct或接口方法必须在C#中有一个返回类型

时间:2015-04-11 00:54:30

标签: c# return-type

using System;
namespace studentObj
{
class Student
{
    private int id ();
    private string name ();
    private char grade ();

    public int ID
    {
        get {return id;}
    }
    public string Name
    {
        get {return name;}
        set {name = value;}
    }
    public char Grade
    {
        get {return grade;}
    }

    public Student(int ID, string Name)
    {
        int id;
        string name;
    }

    public SetGrade(float score)
    {
        if (score>=90.0f)
            grade="A";
        else if (score>=80.0f)
            grade="B";
        else if (score>=70.0f)
            grade="C";
        else if (score>=60.0f)
            grade="D";
        else
            grade='F';
        return grade;
    }

    public override string ToString(){
    }
    class Kid
    {
        private int id { get; }
        private string name { get; set;}
        private char grade { get; }

        public override string ToString ()
        {
            return id + "," + name + "," + grade;
        }
    }
}
class MainClass
{
    public static void Main (string[] args)
    {
        Student student = new Student (Name = "Jasdeep", ID = "234");
        SetGrade.student=75.0f;
        Console.WriteLine (student);
    }
}

}

它说的错误是来自SetGrade块,它说我需要添加一个返回类型,但我很困惑它应该是什么。它应该是成绩或分数还是别的什么。

1 个答案:

答案 0 :(得分:3)

它需要返回类型,即使该类型为void。此方法声明没有这样的类型:

public SetGrade(float score)
然而, 确实会尝试返回一些内容:

return grade;

某些内容似乎是char,因此请将其设为返回类型:

public char SetGrade(float score)

虽然从语义上来说,似乎应该返回任何东西。该方法将自己称为setter,并且实际上应该一个普通的属性setter,因为它不是因为它需要一个参数。所以只需设置值不返回:

public void SetGrade(float score)
{
    if (score>=90.0f)
        grade='A';
    else if (score>=80.0f)
        grade='B';
    else if (score>=70.0f)
        grade='C';
    else if (score>=60.0f)
        grade='D';
    else
        grade='F';
}

(另请注意,我将"A"之类的字符串替换为'A'之类的字符。在C#中,您使用单引号生成char字面值,这与{string字面值非常不同{1}}字面意思。)


现在,这里还有其他问题。我之前从未见过这种语法:

private int id ();
private string name ();
private char grade ();

如果那些只是变量那么你就不想要括号:

private int id;
private string name;
private char grade;

此外,您的构造函数实际上并没有对您传递的值执行任何操作,它只是在其范围内声明变量而从不设置它们:

public Student(int ID, string Name)
{
    int id;
    string name;
}

你可能想要做的事情就是设置班级'私有变量:

public Student(int ID, string Name)
{
    id = ID;
    name = Name;
}

虽然老实说,您可以使用自动生成的属性来简化属性。然后,该课程的大部分内容将如下所示:

class Student
{
    public int ID { get; private set; }
    public string Name { get; set; }
    public char Grade { get; private set; }

    public Student(int id, string name)
    {
        ID = id;
        Name = name;
    }

    public void SetGrade(float score)
    {
        if (score>=90.0f)
            Grade='A';
        else if (score>=80.0f)
            Grade ='B';
        else if (score>=70.0f)
            Grade ='C';
        else if (score>=60.0f)
            Grade ='D';
        else
            Grade ='F';
    }
}

这更符合C#命名约定,减少了大量代码,并且真正清除了类的整体外观。从结构上和语义上来说,还有更多的修复和改进,但我会将其作为练习。