“X”类型的对象无法转换为“X”类型的对象

时间:2010-01-22 06:56:33

标签: c# visual-studio winforms

(不敢相信这还没有被问到,但我找不到重复)

在包含大量项目的Visual Studio中,当我第一次打开解决方案时,我有时会收到警告Object of type "X" cannot be converted to object of type "X"。一般来说,重建似乎会让它消失,但有谁知道这是由什么造成的,以及如何避免它?

更新我在某处读到删除所有resx文件并重建可能有所帮助。我不假思索地试过这个。不是个好主意......

8 个答案:

答案 0 :(得分:20)

这实际上取决于具体情况(模糊),但最可能的原因是不同的程序集引用/版本。也许你有一些引用dll版本“A”的“顶级”代码,并引用一个引用类似dll版本“B”的库;然后:

SomeType foo = someObj.Foo;

将有来自“A”的SomeType(左侧),.Foo来自“B”的SomeType。尝试确保所有项目都使用您所依赖的所有程序集的相同版本。

另一种情况是在不同的名称空间中使用相同的名称,但这有点明显,并且我怀疑错误信息会使这一点变得明显吗?

在某些其他情况下,同一名称空间(但不同的程序集)中具有相同名称的类型会相互冲突;这里的“extern别名”可以提供帮助,但是可以使用完整的PITA。

答案 1 :(得分:5)

如果你有一个用getter / setter暴露一个对象的用户控件,你将会遇到一个糟糕的时间(正如他们所说)。事实上,这是问题的制定者。

所以要解决它,而不是这样做:

public ObjectX
{
    get { return _objx; }
    set 
    {
        _objx=value; 
        //do some other stuff
    }
}

你可以做一些事情:

public ObjectX
{
    get { return _objx; }
}
public void SetObjectX(ObjectX inVal)
{
    _objx = inVal; 
    //do some other stuff
}

...这将阻止Visual Designer在设计时尝试将ObjectX的序列化版本分配给您的控件,这正是发生的事情......

答案 2 :(得分:4)

我发现以下内容很有用,如下所述:Object of type 'Data.TimeLineChartedDay[]' cannot be converted to type 'Data.TimeLineChartedDay[]'?

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

答案 3 :(得分:3)

我遇到了同样的问题,虽然Marc的回答确实帮助我理解出了什么问题,但它并没有解决我的问题。重建没有帮助,在这种情况下我没有使用序列化。

原来我的问题正在发生,因为我的项目有自己的引用(不太确定发生了怎么回事,也许Resharper在没有注意的情况下添加了引用?),它将.cs文件与编译的.dll文件进行比较。我只是删除了参考文献。

希望这可以帮助其他人解决同样的问题!

答案 4 :(得分:2)

指示的类型可能具有相同的名称,相同的命名空间和相同的程序集(DLL),但位于不同的版本或位置。

您可以在您所指的那两个对象上尝试以下代码来定义其程序集的位置。

SampleObject.GetType().Assembly.CodeBase

答案 5 :(得分:1)

我遇到了和你一样的错误,但是我删除了resx文件。

答案 6 :(得分:1)

在尝试了以上所有内容之后,清理,重建,删除/重新添加引用并编辑设计器文件 - 最后只需关闭Visual Studio并重新打开项目就可以使一切变得更好。

TL;博士

尝试将其关闭再打开。

答案 7 :(得分:1)

我遇到了同样的错误,我尝试了上面的一些解决方案,但没有对我有用,然后我在resx file中删除了我的属性的数据标记的值标记的内容。

例如,如果MyProp用户控件中产生错误的属性为MyUserControl,则会在resx file中找到名称为MyUserControl.MyProp的数据标记,删除它的价值标签的内容。