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
.
您的方法中有这些变量(作为方法参数(:
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
不知道Age
或Name
,你的类Person
知道,所以你应该将方法签名更改为:
static bool SortByAll(Person arg1, Person arg2, string what, string uptown)
也就是说,让我们尝试使您的方法不那么脆弱且更安全。
- 为什么要使用字符串来指定您希望的排序方式?如果有人传入字符串
descending
而不是Descending
,该方法将无法正常工作,更糟糕的是,编译器不会警告消费者他的代码中存在错误。
在您的情况下,使用如下所示的bool
会简单得多:
static bool SortByAll(Person arg1, Person arg2, string what, bool descending)
现在很明显,没有犯错的余地。您可以通过true
或false
,两者都是您方法的合法选项。如果情况是需要 3 个或更多选项,那么一个好方法是使用枚举。
- 同样的问题也发生在你的
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);
我将上述方法的实施留给您。