0

我在一个新类中有这个代码:

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 无法将类型“object”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)

但是,如果我删除 line:public List<string> currentCrawlingSite { get; set; }和 line:currentCrawlingSite = some_params[3]就没有错误。

我不明白。csFiles并且currentCrawlingSite都是List<string>类型变量。为什么,当我添加 时currentCrawlingSite,我会收到错误消息?

4

5 回答 5

2

因为编译器不知道也不可能知道Object-array 的第一个和第四个元素恰好是List<string>.

您必须相应地投射它们:

csFiles = (List<String>)some_params[0]

等等或更好,如果可能的话,使用适当的类型而不是简单的Object-array 来传递数据。

于 2013-03-28T07:58:15.850 回答
1

这里的重点OnProgressEvent是向您发送一个Object数组,因此您试图在该“罪魁祸首”行中分配一个Object类型List<string>变量,从而隐式调用强制转换操作。你真的应该在那里做一个明确的演员来解决你的问题。

C# 中新的和首选的语法是:

csFiles = some_params[0] as List<String>;
于 2013-03-28T07:58:49.833 回答
0

假设您分配的数据是 List<string> 您需要将其转换为这种类型:

new WebCrawlerProgressEventHandler()
{
    csFiles = (List<string>)some_params[0],
    mainUrl = some_params[1],
    levels = some_params[2],
    currentCrawlingSite = (List<string>)some_params[3]
});
于 2013-03-28T07:58:30.977 回答
0

它是强大的打字保护。您应该显式地转换一个对象以List<string>确保您不会在编译时混淆不同的类型

csFiles = (List<string>)some_params[0]

您没有错误,mainUrl = some_params[1]因为每个对象都有ToString()方法,并且默认行为是调用此方法进行隐式类型转换。

J. Richter 在他的书中写道:

例如,C# 不需要任何特殊语法即可将对象转换为其任何基类型,因为转换为基类型被认为是安全的隐式转换。但是,C# 确实要求开发人员将对象显式转换为其任何派生类型,因为这种转换可能在运行时失败。

于 2013-03-28T07:58:49.593 回答
0

currentCrawlingSite是 的一个实例List<string>some_paramsobject数组的一个实例。

您不能隐式转换这两种类型。你必须使用明确的对话。你可以像这样使用它们;

currentCrawlingSite = (List<string>)some_params[3];

也相等

currentCrawlingSite = some_params[3] as List<string>;

您可以阅读更多详细信息Casting and Type Conversions (C# Programming Guide)

于 2013-03-28T07:59:57.110 回答