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.Files
是 HttpFileCollection
,而 NameObjectCollectionBase
。这并不明显,但 GetEnumerator()
会产生集合的 keys - 而不是项目本身。所以:
foreach(string key in Request.Files)
// fetch by key:
var file = Request.Files[key];
// ....
不明显,特别是因为集合是非泛型的IEnumerable
而不是IEnumerable<string>
。
它是 at least documented:
此枚举器将集合的键作为字符串返回。
但是:您并非认为遍历Files
会为您提供文件对象。
【讨论】:
注意:如果它曾是通用版本 (IEnumerable<string>
),那么编译器很有可能会阻止您犯此错误;但是,我想HttpFileCollection
早于泛型。
那为什么只有当文件不为空时才会失败?前任;如果 Request.Files[0] 为空,则它不会失败并进入下一个,如果 Request.Files[1] 不为空,则它会失败。 (或者它可以迭代直到找到一个非空项目)
@Kaf 如果没有文件,则没有可循环的内容,因此没有失败的转换。在其他新闻中,您可以遍历一个空的 int[]
并将每个 int
s(都不是)转换为 SqlConnection
并且它不会在意:因为 没有什么可以循环.
非常适合我。当我尝试通过 c# 控制台应用程序中的本机 HttpClient 对象访问 Web api 时出现此错误游戏以上是关于foreach 循环无法转换,但手动转换和 for 循环工作的主要内容,如果未能解决你的问题,请参考以下文章