我在新课程中有这段代码:
Object[] temp_arr = new Object[5];
temp_arr[0] = csFiles;
temp_arr[1] = mainUrl;
temp_arr[2] = levels;
temp_arr[3] = currentCrawlingSite;
temp_arr[4] = sitesToCrawl;
变量csFiles和currentCrawlingSite都是List< string>。
然后在底部我做了:
public class WebCrawlerProgressEventHandler : EventArgs
{
public List<string> csFiles { get; set; }
public string mainUrl { get; set; }
public int levels { get; set; }
public List<string> currentCrawlingSite { get; set; }
}
protected void OnProgressEvent( Object[] some_params)
{
if (ProgressEvent != null)
ProgressEvent(this,
new WebCrawlerProgressEventHandler()
{
csFiles = some_params[0],
mainUrl = some_params[1],
levels = some_params[2],
currentCrawlingSite = some_params[3]
});
}
现在我在新WebCrawlerProgressEventHandler()
内的所有行上都收到错误,每行都有相同的错误:
错误2无法隐式转换类型&#39;对象&#39;至 &#39; System.Collections.Generic.List&#39 ;.显式转换 存在(您是否错过演员表?)
但如果我删除该行:public List<string> currentCrawlingSite { get; set; }
并且行:currentCrawlingSite = some_params[3]
则没有错误。
我不明白。 csFiles
和currentCrawlingSite
都是List<string>
类型变量。为什么,当我添加currentCrawlingSite
时,我得到错误/ s?
答案 0 :(得分:2)
因为编译器没有也不知道Object
- 数组的第一个和第四个元素恰好是List<string>
。
你必须相应地施放它们:
csFiles = (List<String>)some_params[0]
等。或者更好,如果可能的话,使用适当的类型来传递数据,而不是简单的Object
- 数组。
答案 1 :(得分:1)
这里的要点是OnProgressEvent
向您发送了Object
数组,因此您尝试在“罪魁祸首”中分配Object
到List<string>
类型变量line,从而隐式调用强制转换操作。你应该在那里做一个明确的演员来解决你的问题。
C#中新的和首选语法是:
csFiles = some_params[0] as List<String>;
答案 2 :(得分:0)
假设您要分配的数据是List&lt; string&gt;你需要把它投射到这种类型:
new WebCrawlerProgressEventHandler()
{
csFiles = (List<string>)some_params[0],
mainUrl = some_params[1],
levels = some_params[2],
currentCrawlingSite = (List<string>)some_params[3]
});
答案 3 :(得分:0)
强大的打字保护功能。您应该明确地将对象强制转换为List<string>
,以确保您不会在编译时混淆不同的类型
csFiles = (List<string>)some_params[0]
mainUrl = some_params[1]
上没有错误,因为每个对象都有ToString()
方法,默认行为是调用此方法进行隐式类型转换。
学家里希特在他的书中写道:
例如,C#不需要任何特殊语法来转换对象 到任何基类型,因为考虑了基类型的转换 安全的隐式转换。但是,C#确实需要开发人员 显式地将对象强制转换为任何派生类型,因为这样的 cast可能会在运行时失败。
答案 4 :(得分:0)
currentCrawlingSite
是List<string>
的实例,some_params
是object
数组的实例。
您无法隐式转换这两种类型。你必须使用显式对话。您可以像使用它们一样使用它们
currentCrawlingSite = (List<string>)some_params[3];
也相等
currentCrawlingSite = some_params[3] as List<string>;
中了解更多详情