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

Ben*_*jol 22 c# visual-studio winforms

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

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

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

Mar*_*ell 20

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

SomeType foo = someObj.Foo;
Run Code Online (Sandbox Code Playgroud)

将具有SomeType(在左侧)从"A",具有.FooSomeType从"B".尝试确保所有项目都使用您依赖的所有程序集的相同版本.

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

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


小智 6

如果你有一个使用getter/setter公开对象的用户控件,那么你将会遇到一个糟糕的时间(正如他们所说).事实上,它是问题的制定者.

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

public ObjectX
{
    get { return _objx; }
    set 
    {
        _objx=value; 
        //do some other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以做一些事情:

public ObjectX
{
    get { return _objx; }
}
public void SetObjectX(ObjectX inVal)
{
    _objx = inVal; 
    //do some other stuff
}
Run Code Online (Sandbox Code Playgroud)

...这将阻止Visual Designer在设计时尝试将ObjectX的序列化版本分配给您的控件,这实际上是...