Подтвердить что ты не робот

Объект типа "X" не может быть преобразован в объект типа "X"

(Не могу поверить, что этого еще не задали, но я не могу найти дубликат)

В Visual Studio с большим количеством проектов, когда я впервые открываю решение, иногда получаю предупреждение Object of type "X" cannot be converted to object of type "X". Вообще перестроение, похоже, заставляет его уйти, но кто-нибудь знает, что это вызвано, и как его избежать?

ОБНОВЛЕНИЕ Я где-то читал, что удаление всех ваших файлов resx и восстановление могут помочь. Я бездумно пробовал это. Не очень хорошая идея...

4b9b3361

Ответ 1

Это будет действительно зависеть от точного сценария (то есть неопределенного), но наиболее вероятной причиной могут быть разные ссылки/версии сборки. Возможно, у вас есть код "верхнего уровня", который ссылается на версию "A" DLL и ссылается на библиотеку, которая ссылается на версию "B" аналогичной dll; то:

SomeType foo = someObj.Foo;

будет иметь SomeType (слева) от "A", а .Foo SomeType от "B". Попробуйте убедиться, что все ваши проекты используют ту же версию всех сборок, на которые вы полагаетесь.

Другой сценарий имеет одно и то же имя в разных пространствах имен, но это немного очевидно, и я подозреваю, что сообщение об ошибке станет очевидным?

Существуют и другие сценарии, когда типы с одинаковыми именами в одном и том же пространстве имен (но разные сборки) конфликтуют с eachother; здесь "extern aliases" могут помочь, но это полная PITA для работы.

Ответ 2

Если у вас есть пользовательский элемент управления, который предоставляет объект с помощью getter/setter, у вас будет плохое время (как говорится). Это, по сути, проблема с установщиком.

SO, чтобы исправить это, вместо этого:

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 для вашего контроля во время разработки, что действительно происходит...

Ответ 4

Я столкнулся с одной и той же проблемой, и хотя ответ Марка помог мне понять, что происходит не так, это не решило мою проблему. Реконструкция не помогла, и в этом случае я не использовал сериализацию.

Оказывается, моя проблема возникала, потому что в моем проекте была ссылка на себя (не совсем уверен, как это произошло, возможно, Resharper добавила ссылку, не заметив меня?), и она сравнивала файл .cs с скомпилированным .dll файлом, Я просто удалил ссылку.

Надеюсь, это поможет кому-то еще с той же проблемой!

Ответ 5

Указанные типы могут иметь одно и то же имя, одно и то же пространство имен и одну и ту же сборку (DLL), но в разных версиях или местоположении.

Вы можете попробовать следующий код для этих двух объектов, на которые вы ссылаетесь, чтобы определить расположение их сборок.

SampleObject.GetType().Assembly.CodeBase

Ответ 6

У меня была такая же ошибка, как и вы, но для меня удалялся файл resx.

Ответ 7

После того, как вы попробуете все вышеперечисленное, очистите, переустановите, удалите/повторно добавьте ссылки и отредактируйте файл дизайнера - в итоге просто закрывая визуальную студию и снова открывая проект, все стало лучше.

ТЛ; дг

Попробуйте выключить и снова включить его.