将字符串类型转换为对象类型

3

我刚接触C#,需要在控制台应用程序中显示用户的全名,但是我一直收到这个错误:

无法将类型“string”隐式转换为“UserCustomerNotes.User”

当我只使用return user时,我的代码可以正常工作,但是它在应用程序中只显示“UserCustomerNotes.User”,而我需要显示用户的全名。请问有人能帮忙吗?以下是我的代码:

public static User FindUser(User[] users, int noteid)
{
    foreach (User user in users)                
        if (user.ID == noteid) return user.FullName;
    return null;
}
4个回答

9

您的方法期望返回类型为User的值,如果您希望它返回名称 - 将其更改为:

public static **string** FindUser(User[] users, int noteid)

或者,作为替代方案:
if (user.ID == noteid) return user;

3

你的代码:

public static User FindUser(User[] users, int noteid)
{       
    foreach (User user in users)                
        if (user.ID == noteid) return user.FullName;
    return null;
}

希望在成功找到user.FullName值时,返回一个string对象,而您所声明的方法的返回类型是User。您应该这样做(在当前调用FindUser的位置):
var ArrayOfUsersToSearch = GetAnArrayOfUserFromSomewhere();
var noteId = 3; // Or whatever value you want to use
var myUserToFind = FindUser(ArrayOfUsersToSearch, noteId);

Console.WriteLine("The users full name is: {0}", 
        myUserToFind != null ? myUserToFind.FullName : "Not Found");

并将您的FindUser方法中的代码更改为:

public static User FindUser(User[] users, int noteid)
{       
    foreach (User user in users)                
        if (user.ID == noteid) return user;
    return null;
}

你在返回方法中的user时,看到了“UserCustomerNotes.User”的输出,原因如下:
Console.WriteLine(FindUser(users, noteId));

// instead of

Console.WriteLine(FinderUser(users, noteId).FullName);

由于返回类型为 UserCustomerNotes.User,并且它没有覆盖“ToString”以指定任何不同的内容,因此当 Console.WriteLine 要求您的 User 对象提供其文本等效项时,给出的默认值是其名称。这就解释了为令人困惑的输出结果。

注意:我已经将 Console.WriteLine("The users full name is: {0}", myUserToFind != null ? myUserToFind.FullName : "Not Found"); 放在你的代码中,因为如果无法找到用户,则您的代码可能会返回 null,并且您需要特殊处理提供的输出。

另外值得一提的是,虽然与问题本身无关,但格式如下:
foreach(var x in y)
    do something;

如果在下一行进行更改,那么如果您没有明确调用每个语句块周围的{},则更容易出现“破损”:

foreach (User user in users)                
{
    if (user.ID == noteid) 
    {
        return user.FullName;
    }
}
return null;

对这个答案的质量印象深刻!+1 - AlfredBr
@AlfredBr,谢谢=)这篇文章有点冗长,但我想尽可能回答OP的问题(包括Console.WriteLine输出的“奇怪之处”),似乎有点过头了...;=) - Rob

1

这是因为您的函数类型是User。尝试将其更改为string

public static string FindUser(User[] users, int noteid)
{       
    foreach (User user in users)                
        if (user.ID == noteid) return user.FullName;
    return null;
}

这种方式有缺陷(是的,微不足道!=),从API的角度来看,它拥有一个名为FindUser的方法,返回用户的FullName而不是User...如果OP打算这样做,将方法重命名为FindUsersFullName会更合理。 - Rob

0
您可以在您的 User 类中定义一个 ToString 方法:
public override string ToString()
{
    return FullName;
}

然后你就可以

Console.WriteLine("User name {0}", user);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接