无法将类型’customtype’隐式转换为’othercustomtype’
我是C#的新手。 我有一个Persons类和一个inheritance自Persons类的User类。 我的控制台我在数组中输入用户。 然后,我只需输入用户ID即可向用户arrays中的用户添加注释。 在我的Persons类中,我有这个函数,必须搜索此用户是否在users数组中。
public static Persons FindPerson(Persons[] persons, int noteid) { foreach (Persons person in persons) if (person.ID == noteid) return person; return null; }
在我的User类中,我有一个函数循环id的整个输入,直到它获得users数组中的id。
public static User SelectUser(User[] users) { while (true) { Console.Write("Please enter the User id: "); string input = Console.ReadLine(); int id; if (int.TryParse(input, out id)) { Persons person = Persons.FindPerson(users, id); if (person != null) return person; // fail on "return person" } Console.WriteLine("The User does not exist. Please try again."); } }
一切正常,但我现在在if语句中的“return person”上收到此错误消息。
无法将类型’UserCustomerNotes.Persons’隐式转换为’UserCustomerNotes.User’。 存在显式转换(您是否错过了演员?)
有人可以帮忙吗? 提前致谢。
因为Person
不是nessecarily User
,所以编译器无法将Person
隐式转换为User
。 在您的特定情况下,由于您知道自己有一个User
列表,因此您可以使用以下内容明确告诉它“我知道此Person
实际上是一个User
”:
if (person != null) return (User) person;
如果实例实际上不是User
,则强制转换( (User)
)将在运行时抛出exception,但由于您已经开始使用User
的集合,因此您不必担心。
由于User
inheritance自Person
,因此您无法将任何随机Person
隐式转换为User
(尽管您可以隐式地将User
转换为Person
)。
由于您将User[]
传递给FindPerson(users, id)
,因此您可以确定返回的人确实是User
,因此您可以像这样投射它:
return (User)person;
编辑:您可以考虑在FindPerson
上使用generics来完全避免FindPerson
转换。
public static T FindPerson(IEnumerable persons, int noteid) where T : Person { foreach (T person in persons) { if (person.ID == noteid) { return person; } } return null; } public static User SelectUser(User[] users) { while (true) { Console.Write("Please enter the User id: "); string input = Console.ReadLine(); int id; if (int.TryParse(input, out id)) { User person = Persons.FindPerson(users, id); if (person != null) { return person; } } Console.WriteLine("The User does not exist. Please try again."); } }
您应该像这样重写返回代码段:
User user = Persons.FindPerson(users, id) as User; if (user != null) return user;
您遇到的问题是您尝试从应该返回更多派生类的方法返回基类。 编译器不能自动向下转换( Persons
– > User
),但它可以向上转换( User
– > Persons
)
您需要实现显式或隐式运算符:
class ClassA { public string Property1 { get; set; } public static explicit operator ClassB(ClassA classA) { return new ClassB() { Property2 = classA.Property1 }; } } class ClassB { public string Property2 { get; set; } } var a = new ClassA() {Property1 = "test"}; ClassB b = (ClassB)a; Console.WriteLine(b.Property2); // output is "test"
无论如何,我建议你使用LINQ扩展方法作为你的第一个方法:
using System.Collections.Generic; using System.Linq; public static Persons FindPerson(IEnumerable persons, int id) { return persons.FirstOrDefault(p => p.ID == id); }
看起来好多了吧?