为什么我会收到“无法转换错误”?

时间:2013-03-28 07:54:26

标签: c#

我在新课程中有这段代码:

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]则没有错误。

我不明白。 csFilescurrentCrawlingSite都是List<string>类型变量。为什么,当我添加currentCrawlingSite时,我得到错误/ s?

5 个答案:

答案 0 :(得分:2)

因为编译器没有也不知道Object - 数组的第一个和第四个元素恰好是List<string>

你必须相应地施放它们:

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

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

答案 1 :(得分:1)

这里的要点是OnProgressEvent向您发送了Object数组,因此您尝试在“罪魁祸首”中分配ObjectList<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)

currentCrawlingSiteList<string>的实例,some_paramsobject数组的实例。

您无法隐式转换这两种类型。你必须使用显式对话。您可以像使用它们一样使用它们

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

也相等

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

您可以从Casting and Type Conversions (C# Programming Guide)

中了解更多详情