Object of type “X” cannot be converted to object o

2019-01-18 09:45发布

(Can't believe this hasn't already been asked, but I can't find a dup)

In Visual Studio with lots of projects, when I first open the solution, I sometimes get the warning Object of type "X" cannot be converted to object of type "X". Generally rebuilding seems to make it go away, but does anyone know what this is caused by, and how to avoid it?

UPDATE I read somewhere that deleting all your resx files and rebuilding can help. I unthinkingly tried this. Not a good idea...

8条回答
劫难
2楼-- · 2019-01-18 10:14

If you have a user control that exposes an object with a getter/setter, you are going to have a bad time (as they say). It is, in fact, the setter that is the problem.

SO to fix it, instead of doing this:

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

You could do something along the lines of this:

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

... which will prevent the Visual Designer from trying to assign a serialized version of ObjectX to your control at design time, which is really what was going on ...

查看更多
一夜七次
3楼-- · 2019-01-18 10:15

I had the same error as you but for me removing the resx file worked.

查看更多
唯我独甜
4楼-- · 2019-01-18 10:16

After trying all of the above, cleaning, rebuilding, removing/re-adding references and editing the designer file - in the end simply closing visual studio and re-opening the project made everything better.

tl;dr

Try switching it off and on again.

查看更多
可以哭但决不认输i
5楼-- · 2019-01-18 10:21

This would really depend on the exact scenario (that is vague), but the most likely cause would be different assembly references / versions. Perhaps you have some "top level" code that references version "A" of a dll, and references a library which references version "B" of a similar dll; then:

SomeType foo = someObj.Foo;

would have the SomeType (on the left) from "A", with .Foo the SomeType from "B". Try ensuring that all your projects are using the same version of all the assemblies you rely on.

Another scenario is the same name in different namespaces, but that is a bit of an obvious one, and I suspect the error message would make this obvious?

There are some other scenarios where types with the same names in the same namespace (but different assemblies) conflict with eachother; here "extern aliases" can help, but are a complete PITA to work with.

查看更多
冷血范
6楼-- · 2019-01-18 10:25

The Types indicated may have same name, same namespace, and same Assembly (DLL) but on different versions or location.

You may try the following code on those two objects you are referring to define the location of their assemblies.

SampleObject.GetType().Assembly.CodeBase
查看更多
smile是对你的礼貌
7楼-- · 2019-01-18 10:30

I found the following to be useful, as described here: Object of type 'Data.TimeLineChartedDay[]' cannot be converted to type 'Data.TimeLineChartedDay[]'?

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
查看更多
登录 后发表回答