【问题标题】:IEnumerable cast error c#IEnumerable 转换错误 c#
【发布时间】:2016-11-16 13:59:00
【问题描述】:

我将尝试在 Asp.Net MVC 5(代码优先)中创建自定义身份验证和授权。在我创建了 2 个类的模型中,UserAccountUserAccountModel

我在UserAccountModel 上有错误

return listAccounts.Where(acc => acc.UserName.Equals(username));

错误代码不是英文的,而是这样的: 无法将 IEnumerable 隐式转换为列表,请使用强制转换

如何解决问题?谢谢

//-------------------------------
//UserAccont.cs
//-------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace MvcSia.Models
{
    public class UserAccont
    {
        [Key]
        public int UserId { get; set; }

        [Required(ErrorMessage ="Choose a name")]
        public string Name{ get; set; }

        [Required(ErrorMessage ="Choose surname")]
        public string Surname{ get; set; }

        [Required(ErrorMessage ="Email required")]
        [RegularExpression(@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$", ErrorMessage = "Invalid email")]
        public string Email { get; set; }

        [Required(ErrorMessage = "User Name required")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "User type required")]
        public string UserType { get; set; } 

        [Required(ErrorMessage = "Password required")]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Compare("Password", ErrorMessage ="Password not valid")]
        [DataType(DataType.Password)]

        [Required(ErrorMessage = "User Name required")]
        public string ConfirmPassword { get; set; }

    }
}



//-------------------------------
//UserAccountModel.cs
//-------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcSia.Models
{
    public class UserAccontModel
    {
        private List<UserAccont> listAccounts = new List<UserAccont>();

        public UserAccont find(string username)
        {
            return listAccounts.Single(acc => acc.UserName.Equals(username));
        }

        public UserAccont login(string username, string password)
        {
            return listAccounts.Where(acc => acc.UserName.Equals(username));

        }

    }

}

【问题讨论】:

  • 好吧,您的方法是要返回一个UserAccontUserAccount 的错字,顺便说一句),但Where 方法只返回一个IEnumerable&lt;UserAccont&gt;。也许您的意思是FirstOrDefault 而不是Where?我还强烈鼓励您遵循 .NET 命名约定。
  • 您的方法期望返回类型为 UserAccont 而不是 List&lt;UserAccont&gt; 的集合
  • 如果您更改为 FirstOrDefault 或 SingleOrDefault,请不要忘记对登录方法的返回值进行空检查。此外,我会在您的 Find 方法上使用 FirstOrDefault 或 SingleOrDefault 并对它们进行空检查。如果传递的用户帐户不存在,您的查找将引发异常。
  • 除了我们大多数人可能知道您试图描述的错误之外:如果您很难将异常消息翻译成英文,请尝试finderr.net。它从 .NET Framework 中以某些语言及其相应的英文翻译提供了广泛的例外选择(如果不是全部)。

标签: c# list casting ienumerable


【解决方案1】:

你得到的错误是:

无法将类型 IEnumerable&lt;UserAccont&gt; 隐式转换为 UserAccont.

您的方法尝试返回IEnumerable&lt;UserAccont&gt;(多个),但签名说它应该返回UserAccont(一个)。您可能想要的是FirstOrDefaultSingleOrDefault

LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria

当您使用Where 时,它会创建一个IEnumerable&lt;UserAccont&gt;,其中包含所有符合您条件的项目。但是您的方法的签名表明您只想返回一项。

    public UserAccont login(string username, string password)
    {
        // Fetch one item instead.
        return listAccounts.FirstOrDefault(acc => acc.UserName.Equals(username));
    }

【讨论】:

    【解决方案2】:

    您似乎正试图返回 IEnumerable&lt;UserAccount&gt;,而该方法应为 UserAccount

    尝试使用返回单个用户帐户对象的方法。

    public UserAccont login(string username, string password)
    {
        return listAccounts.Single(acc => acc.UserName.Equals(username));
    }
    

    【讨论】:

      【解决方案3】:
      return listAccounts.Where(acc => acc.UserName.Equals(username));
      

      这会返回一个IEnumerable&lt;T&gt;

      return listAccounts.Where(acc => acc.UserName.Equals(username)).ToList();
      

      这会返回一个List&lt;T&gt;

      return listAccounts.Where(acc => acc.UserName.Equals(username)).FirstOrDefault();
      

      这将在List&lt;T&gt; 中返回“T”,在您的情况下将是UserAccount 的单个实例,这最好是您想要的。

      【讨论】:

        【解决方案4】:

        如果您只想返回UserAccont 的类型,请使用FirstOrDefault() 方法。

        public UserAccont login(string username, string password)
        {
                List<UserAccont> listOfUserAcconts = new List<UserAccont>();
        
                //Stops you throwing an Exception is username is null
                if(listAccounts.Count() > 0 && !String.IsNullOrWhiteSpace(username))
                {
                    return listAccounts.FirstOrDefault(acc => acc.UserName.Equals(username));
                }
                else
                {
                    return listOfUserAcconts;
                }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 1970-01-01
          • 1970-01-01
          • 2011-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多