我是C#的新手。我有一个Persons类和一个继承自Persons类的User类。我的控制台我在一个数组中输入用户。然后,我只需输入用户ID即可向用户数组中的用户添加注释。在我的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”。存在显式转换(您是否错过了演员?)
有人可以帮忙吗?提前谢谢。
答案 0 :(得分:12)
由于Person
不是User
,因此编译器无法将Person
隐式转换为User
。在您的特定情况下,由于您知道您有User
的列表,因此您可以明确告诉它,“我知道Person
实际上是User
“以下内容:
if (person != null)
return (User) person;
如果实例实际上不是(User)
,则强制转换(User
)将在运行时抛出异常,但是因为您已经开始使用User
的集合开始,你不用担心。
答案 1 :(得分:4)
由于User
继承自Person
,您无法将任意随机Person
隐式转换为User
(尽管您可以隐式地将User
转换为Person
{1}})。
由于您将User[]
传递给FindPerson(users, id)
,因此您可以确定返回的人确实是User
,因此您可以像这样投出:
return (User)person;
修改:您可以考虑在FindPerson
上使用泛型来完全避免播放。
public static T FindPerson<T>(IEnumerable<T> 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.");
}
}
答案 2 :(得分:3)
您应该像这样重写返回代码段:
User user = Persons.FindPerson(users, id) as User;
if (user != null) return user;
您遇到的问题与您尝试从应该返回更多派生类的方法返回基类有关。编译器无法自动向下转换(Persons
- &gt; User
),但它可以向上转换(User
- &gt; Persons
)
答案 3 :(得分:3)
您需要实现显式或隐式运算符:
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"
答案 4 :(得分:0)
无论如何,我建议您使用LINQ扩展方法作为第一种方法:
using System.Collections.Generic;
using System.Linq;
public static Persons FindPerson(IEnumerable<Person> persons, int id)
{
return persons.FirstOrDefault(p => p.ID == id);
}
看起来好多了,对吧?