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

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

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

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

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

 SomeType foo = someObj.Foo; 

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

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

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

如果你有一个用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的序列化版本分配给您的控件,这实际上是…

我发现以下内容很有用,如下所述: ‘Data.TimeLineChartedDay []’类型的对象无法转换为’Data.TimeLineChartedDay []’类型?

 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 

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

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

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

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

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

 SampleObject.GetType().Assembly.CodeBase 

我有同样的错误,但对我来说删除resx文件工作。

在完成上述所有操作后,清理,重建,删除/重新添加引用并编辑设计器文件 – 最后只需关闭Visual Studio并重新打开项目就可以使一切变得更好。

TL;博士

尝试将其关闭再打开。

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

例如,如果在MyUserControl用户控件中产生错误的属性是MyProp ,您将在resx file找到名为MyUserControl.MyProp的数据标记,删除其值标记的内容。