C#类错误CS1061 CS1056

时间:2016-01-01 19:28:10

标签: c# class

我想编写排序类' Person'。

班级'人员'包括"姓名","年龄","主要"。

喜欢这个。

class Person
{
    public int Age;
    public string Name;
    public string Major;
    public override string ToString()
    {
        return Name + ": " + Age + " , Major in " + Major;
    }
    public Person(int Age, string Name, string Major)
    {
        this.Age = Age;
        this.Name = Name;
        this.Major = Major;
    }
}

我通过书来学习,并且只有" DescSortByName"代码:

    static bool DescSortByName(object arg1, object arg2)
    {
        Person person1 = arg1 as Person;
        Person person2 = arg2 as Person;

        return person1.Name.CompareTo(person2.Name) < 0;
    }

但我想编码用户可以选择什么样的属性和升序的降序。

所以我这样编码:

    static bool SortByAll(object arg1, object arg2, string what, string updown)
    {
        Person person1 = arg1 as Person;
        Person person2 = arg2 as Person;
        int comp;
        what = what.ToLower();

        switch (what)
        {
            case "name":
                comp = arg1.Name.CompareTo(arg2.Name); //1.
                break;
            case "age":
                int xa = arg1.Age; int ya = arg2.Age; //2.
                if (xa > ya) { comp = 1; }
                else { comp = -1; }
                break;
            case "major":
                comp = arg1.Major.CompareTo(arg2.Major); //3.
                break;
        }
        if (updown == "Descending")
        { return comp == -1; }  //4.
        else { return comp == 1; }
    }

前者绝对运作良好,但我的(后者)没有,我无法找到它们之间的区别。

在错误列表中,有两种错误。

在1,2,3中(我在代码中赞赞// 1。),错误是CS1061:

'object' does not contain a definition for 'Name' and no extension method 'Name'
accepting a first argument of type 'object' could be found
(are you missing a using directive or an assembly reference?).

和4中,错误是CS1056:

Use of unassigned local variable 'comp'.

...

请告诉我我做错了什么以及如何解决。

PS。我是韩国人,所以我不擅长英语,所以这些句子可能很尴尬。对不起。

PPS。我非常高兴收到所有其他反馈意见!

购买力平价。我没想到arg1arg2的类型不是Person

3 个答案:

答案 0 :(得分:1)

您的方法中有这些变量(作为方法参数):

object arg1, object arg2

你试着在这里使用它们:

arg1.Name.CompareTo(arg2.Name)

正如错误所述,object没有名为Name的属性。您可以使用您的Person对象:

person1.Name.CompareTo(person2.Name)

如果NullReferenceException的{​​{1}}不属于object,则会冒Person的风险。由于该方法假定它们必须属于Person类型,因此只需完全删除Person变量并更改方法以期望该类型:

static bool SortByAll(Person arg1, Person arg2, string what, string updown)

您正在使用comp变量:

if (updown == "Descending")
{ return comp == -1; }  //4.
else { return comp == 1; }

但是你无法保证该变量将具有值。这是编译器警告你的内容。只需在声明它时给它一个默认值:

int comp = 0;

答案 1 :(得分:0)

您的代码存在很多问题。

关于您获得的错误,您的方法是与键入的object实例进行比较。 object对您的班级Age不知道NamePerson,所以您应该将方法签名更改为:

 static bool SortByAll(Person arg1, Person arg2, string what, string uptown)

那就是说,让我们试着让你的方法变得不那么脆弱和安全。

  1. 为什么要用字符串来指定你想要的东西?如果有人传入字符串descending而不是Descending,该方法将无法正常工作,更糟糕的是,编译器不会警告消费者他的代码中存在错误。
  2. 在你的情况下,使用bool likeo:

    会简单得多
     static bool SortByAll(Person arg1, Person arg2, string what, bool descending)
    

    现在很明显,没有错误的余地。您可以通过truefalse,两者都是您方法的合法选项。如果您需要3个或更多选项,那么最好的方法是使用enumerations

    1. 您的what参数也会出现同样的问题。如果消费者拼错该属性或仅指定Person未实现的属性,会发生什么。再次,编译器将无法警告这样的错误,并且您的程序将在运行时崩溃,这是不好的。
    2. 在这种情况下,您需要一种类型安全的方法让消费者定义在订购时使用的属性。欢迎来到泛型,Func<>和lambdas。

      static bool SortByAll<T>(Person arg1, Person arg2, Func<Person, T> what, bool descending)
      

      你会像这样使用它:

      SortByAll(Person p1, Person p2, p => p.Age, true);
      

      我将实施方法留给你。

答案 2 :(得分:0)

把书扔掉了。以正确的方式做到这一点

    public class Person
    {
        public int Age;
        public string Name;
        public string Major;
        public override string ToString()
        {
            return Name + ": " + Age + " , Major in " + Major;
        }
        public Person(int Age, string Name, string Major)
        {
            this.Age = Age;
            this.Name = Name;
            this.Major = Major;
        }
        public int CompareTo(Person person, string updown, string what)
        {
            int comp = 0;
            what = what.ToLower();

            switch (what)
            {
                case "name":
                    comp = this.Name.CompareTo(person.Name); //1.
                    break;
                case "age":
                    comp = this.Age.CompareTo(person.Age);
                    break;
                case "major":
                    comp = this.Major.CompareTo(person.Major); //3.
                    break;
            }
            if (updown == "Descending")
            { 
                return comp *= -1; 
            }  //4.
            else 
            { 
                return comp; 
            }

        }
    }​
相关问题