【问题标题】:Cannot implicitly convert type system.colllections.generic无法隐式转换类型 system.collections.generic
【发布时间】:2014-10-01 05:35:29
【问题描述】:

我收到以下错误:

无法将类型“System.Collections.Generic.List>”隐式转换为“System.Collections.Generic.List”

我的代码是:

class Check
{
      public string Text { get; set; }

      public  List<Check> getxml()
      {
          XDocument xdoc = XDocument.Load(@"D:\Web Utf-8 Converter\Categories.xml");

          var list = (from p in xdoc.Descendants("Categories")
                      select p.Elements("name"));

          var listing = list.ToList();

          return listing;
      }
}

在我看来,这像是一个转换错误。但我不确定如何转换。请协助。

谢谢。

【问题讨论】:

  • 只是因为它是两个不同的类。如果您的 Check 类应该保存来自 xml 的信息,那么您必须将其存储在一个新的 Check 类中,然后返回该列表。目前您正在尝试返回 列表。
  • 你能举个例子吗

标签: c# .net linq


【解决方案1】:

根据您的编辑,它应该是这样的:

return xdoc
    .Descendants("Categories")
    .SelectMany(_ => _.Elements("name"))
    .Select(_ => new Check(_.Value))
    .ToList();

注意,getxml 不应该是 Check 类的实例方法。至少应该是静态工厂方法。

【讨论】:

    【解决方案2】:

    select 语句返回 System.Xml.Linq.XElement。您的方法的返回类型是 List。这些不一样。

    你可以做的是:

     var list = (from p in xdoc.Descendants("Categories")
         select new Check { Text = p.Elements("name").Value});
    

    但是我认为你的类 Check 不应该读取 xml 并存储每个元素的结果。

    您应该拥有一个具有 GetXml 方法的类“XmlParser”和一个保存信息的类“XmlValue”。即

    public class XmlValue
    {
        public System.Xml.Linq.XElement Element { get; set; }
        public string Text
        {
            get
            {
                if(Element == null) return null;
                return Element.Value;
            }
        }
    }
    
    public class XmlParser
    {
        public List<XmlValue> GetXml()
        {
            XDocument xdoc = XDocument.Load(@"D:\Web Utf-8 Converter\Categories.xml");
    
            return xdoc
                .Descendants("Categories")
                .SelectMany(p => p.Elements("name"))
                .Select(p => new XmlValue { Element = p });
                .ToList();
        }
    }
    
    void Main()
    {
        XmlParser parser = new XmlParser();
        var list = parser.GetXml();
        foreach(var el in list)
            Console.WriteLine(el.Text);
    }
    

    【讨论】:

    • '不能将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Xml.Linq.XElement'。存在显式转换(您是否缺少演员表?)'
    • 在 'Element = p.Elements("name")' 处出现上述错误
    • 这很有效,但它会返回完整的元素。我怎样才能得到它的属性
    • 这是返回的内容:,我只需要文本部分
    • 我接受你的回答我会为此提出另一个问题。谢谢
    【解决方案3】:

    您正在返回来自

    的列表
    var list = (from p in xdoc.Descendants("Categories")
                      select p.Elements("name"));
    

    但是返回类型是List。 “System.Xml.Linq.XElement”不是“检查”,您必须以某种方式提供转换。也许编写一个构造函数来接受 System.Xml.Linq.XElement 的 Check-class ,然后你可以而不是返回列表

    return listing.Select(x => new Check(x)).ToList(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多