foreach 循环无法转换,但手动转换和 for 循环工作

Posted

技术标签:

【中文标题】foreach 循环无法转换,但手动转换和 for 循环工作【英文标题】:foreach loop fails to cast but manual casting and for loop work 【发布时间】:2013-01-24 07:26:04 【问题描述】:

此代码不起作用当它找到一个非空文件时抛出

无法将“System.String”类型的对象转换为类型 'System.Web.HttpPostedFile'。

foreach (System.Web.HttpPostedFile f in Request.Files)

   if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
   
      //work done here
   

我还测试了Request.Files 数组中的每个项目,可以在调试模式下手动转换如下(每个索引)

?(System.Web.HttpPostedFile)Request.Files[index]
System.Web.HttpPostedFile
    ContentLength: 536073
    ContentType: "application/pdf"
    FileName: "E:\\2.pdf"
    InputStream: System.Web.HttpInputStream

但是,以下代码有效

for (index = 0; index < Request.Files.Count; index++)

   System.Web.HttpPostedFile f = Request.Files[index];
   if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
   
      //work done here
   

知道出了什么问题吗?谢谢

【问题讨论】:

【参考方案1】:

尝试如下..它会工作

foreach (string fName in Request.Files)

   System.Web.HttpPostedFile f = Request.Files[fName];
   if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
   
      //work done here
   

HttpFileCollection 返回文件的键,而不是 HttpPostedFile 对象。所以只有它会抛出错误。

【讨论】:

我已经用 for 循环解决了这个问题,我在问为什么 foreach 循环会失败。 @Kaf:无法将“System.String”类型的对象转换为“System.Web.HttpPostedFile”类型。这是你的错误吗...? 是的。还有为什么只有当文件不为空时才会失败? 它失败是因为 Request.Files 有键值并且它是字符串......(即)名称......如果它是空的,那么它不会尝试 For 循环条件......如果它有值然后它尝试 for 循环中的条件并尝试将该字符串分配给 HttpPostedFile 对象...所以只会发生错误...【参考方案2】:

Request.FilesHttpFileCollection,而 NameObjectCollectionBase。这并不明显,但 GetEnumerator() 会产生集合的 keys - 而不是项目本身。所以:

foreach(string key in Request.Files) 
    // fetch by key:
    var file = Request.Files[key];

    // ....

不明显,特别是因为集合是非泛型的IEnumerable 而不是IEnumerable&lt;string&gt;

at least documented:

此枚举器将集合的键作为字符串返回。

但是:您并非认为遍历Files 会为您提供文件对象

【讨论】:

注意:如果它是通用版本 (IEnumerable&lt;string&gt;),那么编译器很有可能会阻止您犯此错误;但是,我想HttpFileCollection 早于泛型。 那为什么只有当文件不为空时才会失败?前任;如果 Request.Files[0] 为空,则它不会失败并进入下一个,如果 Request.Files[1] 不为空,则它会失败。 (或者它可以迭代直到找到一个非空项目) @Kaf 如果没有文件,则没有可循环的内容,因此没有失败的转换。在其他新闻中,您可以遍历一个空的 int[] 并将每个 ints(都不是)转换为 SqlConnection 并且它不会在意:因为 没有什么可以循环. 非常适合我。当我尝试通过 c# 控制台应用程序中的本机 HttpClient 对象访问 Web api 时出现此错误游戏

以上是关于foreach 循环无法转换,但手动转换和 for 循环工作的主要内容,如果未能解决你的问题,请参考以下文章

在R中将嵌套的for循环转换为并行

JS中的forEach,for in,for of和for的遍历优缺点及区别

粗略总结for循环与foreach()循环区别

forEach 循环 Java 8 for Map 条目集

foreach用法

foreach用法