Объект типа "X" не может быть преобразован в объект типа "X"
(Не могу поверить, что этого еще не задали, но я не могу найти дубликат)
В Visual Studio с большим количеством проектов, когда я впервые открываю решение, иногда получаю предупреждение Object of type "X" cannot be converted to object of type "X"
. Вообще перестроение, похоже, заставляет его уйти, но кто-нибудь знает, что это вызвано, и как его избежать?
ОБНОВЛЕНИЕ Я где-то читал, что удаление всех ваших файлов resx и восстановление могут помочь. Я бездумно пробовал это. Не очень хорошая идея...
Ответы
Ответ 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 для вашего контроля во время разработки, что действительно происходит...
Ответ 3
Я нашел следующее полезным, как описано здесь: Объект типа 'Data.TimeLineChartedDay []' не может быть преобразован в тип 'Data.TimeLineChartedDay []'?
[DesignerSerializationVisiblity(DesignerSerializationVisiblity.Hidden)]
Ответ 4
Я столкнулся с одной и той же проблемой, и хотя ответ Марка помог мне понять, что происходит не так, это не решило мою проблему. Реконструкция не помогла, и в этом случае я не использовал сериализацию.
Оказывается, моя проблема возникала, потому что в моем проекте была ссылка на себя (не совсем уверен, как это произошло, возможно, Resharper добавила ссылку, не заметив меня?), и она сравнивала файл .cs с скомпилированным .dll файлом, Я просто удалил ссылку.
Надеюсь, это поможет кому-то еще с той же проблемой!
Ответ 5
Указанные типы могут иметь одно и то же имя, одно и то же пространство имен и одну и ту же сборку (DLL), но в разных версиях или местоположении.
Вы можете попробовать следующий код для этих двух объектов, на которые вы ссылаетесь, чтобы определить расположение их сборок.
SampleObject.GetType().Assembly.CodeBase
Ответ 6
У меня была такая же ошибка, как и вы, но для меня удалялся файл resx.
Ответ 7
После того, как вы попробуете все вышеперечисленное, очистите, переустановите, удалите/повторно добавьте ссылки и отредактируйте файл дизайнера - в итоге просто закрывая визуальную студию и снова открывая проект, все стало лучше.
ТЛ; дг
Попробуйте выключить и снова включить его.