C# class error CS1061 CS1056

本文关键字:CS1056 CS1061 error class | 更新日期: 2023-09-27 18:28:50

我想对类'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'.

请让我知道我做错了什么以及如何解决它。

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

.pps。我很高兴收到所有其他类型的反馈!

购买力平价。我没想到arg1的类型,arg2不是Person.

C# class error CS1061 CS1056

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

object arg1, object arg2

你试着在这里使用它们:

arg1.Name.CompareTo(arg2.Name)

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

person1.Name.CompareTo(person2.Name)

尽管如果这些object不属于Person类型,您将面临NullReferenceException的风险。 由于该方法假定它们必须是 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;

把书扔掉。 以正确的方式做

    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; 
            }
        }
    }​

你的代码有很多问题。

关于您遇到的错误,您的方法正在与键入object的实例进行比较。 object不知道AgeName,你的类Person知道,所以你应该将方法签名更改为:

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

也就是说,让我们尝试使您的方法不那么脆弱且更安全。

  1. 为什么要使用字符串来指定您希望的排序方式?如果有人传入字符串descending而不是Descending,该方法将无法正常工作,更糟糕的是,编译器不会警告消费者他的代码中存在错误。

在您的情况下,使用如下所示的bool会简单得多:

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

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

  1. 同样的问题也发生在你的what论点上。如果使用者拼错属性或只是指定Person未实现的属性,会发生什么情况。同样,编译器将无法警告此类错误,并且您的程序将在运行时崩溃,这不好。

在这种情况下,您需要一种类型安全的方法,让使用者定义排序时要使用的属性。欢迎使用泛型、Func<>和 lambda。

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

你会像这样使用它:

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

我将上述方法的实施留给您。