无法将类型'System.Uri'隐式转换为'System.Collections.Generic.List <string>'ERROR </string>

时间:2012-11-01 11:40:48

标签: c# asp.net

我正在使用HTML Agility来获取所有图像,因为图像并不总是具有我想要遵循的绝对路径。但是代码中下面标记的行会生成错误

无法将类型'System.Uri'隐式转换为'System.Collections.Generic.List'

我不知道如何解决这个问题我尝试了很多选项,但继续得到一个或另一个错误

List<String> imgList = (from x in doc.DocumentNode.Descendants("img")
                      where x.Attributes["src"] != null
                      select x.Attributes["src"].Value.ToLower()).ToList<String>();

List<String> AbsoluteImageUrl = new List<String>();

foreach (String element in imgList)
{
    AbsoluteImageUrl = new Uri(baseUrl, element); //GIVES ERROR
}

3 个答案:

答案 0 :(得分:2)

编译器会生成错误,因为AbsoluteImageUrl的类型与Uri的类型不兼容。如果需要将Uri添加到字符串列表中,则应获取其基础字符串(例如Uri.AbsolutePath)。在这种情况下,代码如下所示:

AbsoluteImageUrl.Add(new Uri(baseUrl, element).AbsolutePath);

另一方面,如果您需要Uri列表,请保留原始代码并更改AbsoluteImageUrl的类型:

List<Uri> AbsoluteImageUrl = new List<Uri>();

完成此操作后,您应该在循环中使用AbsoluteImageUrl.AddUri添加到列表中。


关于Uri.ToString()Uri.AbsolutePath之间差异的评论中的讨论,它们对官方MSDN有不同的定义,因此它取决于他/她应该使用的OP的要求。在旁注中,Uri.ToString的源代码如下,因此它与AbsolutePath根本不同:

[SecurityPermission(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.Infrastructure)]
public override string ToString()
{
    if (this.m_Syntax == null)
    {
        if (this.m_iriParsing && this.InFact(Flags.HasUnicode))
        {
            return this.m_String;
        }
        return this.OriginalString;
    }
    this.EnsureUriInfo();
    if (this.m_Info.String == null)
    {
        if (this.Syntax.IsSimple)
        {
            this.m_Info.String = this.GetComponentsHelper(UriComponents.AbsoluteUri, (UriFormat) 0x7fff);
        }
        else
        {
            this.m_Info.String = this.GetParts(UriComponents.AbsoluteUri, UriFormat.SafeUnescaped);
        }
    }
    return this.m_Info.String;
}

答案 1 :(得分:1)

你可能想要

AbsoluteImageUrl.Add(new Uri(baseUrl, element).ToString());

答案 2 :(得分:0)

List<Uri> AbsoluteImageUrl = new List<Uri>();

foreach (String element in imgList)
{
    AbsoluteImageUrl.Add(new Uri(baseUrl, element));
}