类型为"X"的对象无法转换为类型为"X"的对象。

24

(真不敢相信这个问题还没有被问过,但我找不到重复的问题)

在拥有大量项目的 Visual Studio 中,当我第一次打开解决方案时,有时会出现警告 无法将类型为“X”的对象转换为类型为“X”的对象。通常重新生成似乎可以让其消失,但是有人知道是什么引起的,并且如何避免它吗?

更新 我在某个地方读到删除所有 resx 文件并重新生成可以帮助解决问题。我不经思考地尝试了这个方法。不是个好主意...

8个回答

20
这取决于具体的情况(比较模糊)。最有可能的原因是不同程序集引用/版本。也许您有一些“顶层”代码引用了 dll 版本“A”,并引用了一个引用类似 dll 版本“B”的库,那么:
SomeType foo = someObj.Foo;

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

另一种情况是不同名称空间中相同的名称,但那有点显而易见,我怀疑错误消息会使其变得明显?

还有一些其他场景,在同一命名空间中具有相同名称的类型(但属于不同的程序集)会发生冲突; 在这种情况下,“extern aliases”可以帮助解决问题,但是处理起来相当麻烦。


1
我猜这就是问题所在,因此重建可以解决它。 - Mongus Pong
1
你如何检查程序集版本? - n00dles

6
如果您有一个公开具有getter/setter的对象的用户控件,您将会遇到麻烦(正如他们所说的那样)。实际上,问题出在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
}

... 这将防止可视化设计器在设计时尝试为您的控件分配ObjectX的序列化版本,这实际上是正在发生的事情 ...


4

请参见 https://dev59.com/G3VD5IYBdhLWcg3wR5ko - Christian Junk

4

在尝试了上述所有方法,清理、重建、删除/重新添加引用和编辑设计文件后 - 最终只需关闭Visual Studio并重新打开项目即可解决问题。

简而言之:

尝试关闭再重新打开。


3
我遇到了同样的问题,尽管Marc的答案帮助我理解了出错的原因,但并没有解决我的问题。重建也没有帮助,而且在这种情况下我没有使用序列化。
事实证明,我的问题是由于我的项目引用了自身(不太确定是如何发生的,可能是Resharper在我没有注意到的情况下添加了引用),并将.cs文件与编译后的.dll文件进行比较。我只需删除引用即可。
希望这能帮助其他遇到相同问题的人!

2

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

您可以尝试对您所引用的这两个对象使用以下代码来定义它们程序集的位置。

SampleObject.GetType().Assembly.CodeBase

1

我遇到了和你一样的错误,但对我来说,删除resx文件起了作用。


1
我遇到了同样的错误,尝试了上面的一些解决方案,但都没有起作用,然后我删除了在resx文件中我的属性的data标记的value标记的内容。
例如,如果产生错误的属性是MyProp,位于MyUserControl用户控件中,在resx文件中会找到一个名称为MyUserControl.MyProp的数据标记,请删除其value标记的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接