Объект типа "X" не может быть преобразован в объект типа "X" - PullRequest
21 голосов
/ 22 января 2010

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

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

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

Ответы [ 8 ]

20 голосов
/ 22 января 2010

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

SomeType foo = someObj.Foo;

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

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

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

6 голосов
/ 21 мая 2013

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

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

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 голосов
/ 29 декабря 2012

Мне показалось полезным следующее, как описано здесь: Объект типа 'Data.TimeLineChartedDay []' нельзя преобразовать в тип 'Data.TimeLineChartedDay []'?

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
3 голосов
/ 08 мая 2013

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

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

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

2 голосов
/ 02 марта 2016

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

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

SampleObject.GetType().Assembly.CodeBase
1 голос
/ 28 марта 2018

У меня была та же ошибка, я пробовал некоторые решения выше, но у меня ничего не получалось, затем я удалил содержимое тега значения тега данных моего свойства в resx file.

Например, если свойство, выдавшее ошибку: MyProp в пользовательском элементе управления MyUserControl, в resx file вы найдете тег данных с именем MyUserControl.MyProp, удалите содержимое его тега значения.

1 голос
/ 26 марта 2014

Попробовав все вышеперечисленное, очистка, перестройка, удаление / повторное добавление ссылок и редактирование файла конструктора - в конце концов, простое закрытие Visual Studio и повторное открытие проекта сделали все лучше.

ТЛ; др

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

1 голос
/ 26 августа 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...