无法将类型'customtype'隐式转换为'othercustomtype'

时间:2010-09-21 06:37:29

标签: c# type-conversion

我是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”。存在显式转换(您是否错过了演员?)

有人可以帮忙吗?提前谢谢。

5 个答案:

答案 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);
}

看起来好多了,对吧?