无法将类型’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的集合,因此您不必担心。

由于Userinheritance自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); } 

看起来好多了吧?