【问题标题】:Object of type "X" cannot be converted to object of type "X"“X”类型的对象不能转换为“X”类型的对象
【发布时间】:2010-01-22 06:56:32
【问题描述】:

(不敢相信这还没有被问到,但我找不到副本)

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

更新我在某处读到删除所有 resx 文件并重建会有所帮助。我不假思索地尝试了这个。不是个好主意...

【问题讨论】:

    标签: c# visual-studio winforms


    【解决方案1】:

    这实际上取决于确切的场景(即模糊),但最可能的原因是不同的程序集引用/版本。也许您有一些引用 dll 版本“A”的“顶级”代码,并引用了引用类似 dll 版本“B”的库;那么:

    SomeType foo = someObj.Foo;
    

    将有来自“A”的SomeType(左侧),以及来自“B”的.FooSomeType。尝试确保您的所有项目都使用您所依赖的所有程序集的相同版本。

    另一种情况是不同命名空间中的名称相同,但这有点明显,我怀疑错误消息会使这一点变得明显?

    还有其他一些场景,同一个命名空间(但不同的程序集)中的同名类型相互冲突;这里的“外部别名”可以提供帮助,但可以使用完整的 PITA。

    【讨论】:

    • +1 用于不同的版本。我怀疑这就是它的本质,这就是为什么重建可以解决它。
    • 如何检查程序集版本?
    【解决方案2】:

    如果您的用户控件使用 getter/setter 公开对象,那么您将度过一段糟糕的时光(正如他们所说)。实际上,问题出在 setter 上。

    所以要修复它,而不是这样做:

    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
    }
    

    ...这将阻止可视化设计器在设计时尝试将 ObjectX 的序列化版本分配给您的控件,这确实是正在发生的事情...

    【讨论】:

      【解决方案3】:

      我发现以下内容很有用,如下所述:Object of type 'Data.TimeLineChartedDay[]' cannot be converted to type 'Data.TimeLineChartedDay[]'?

      [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
      
      【解决方案4】:

      我遇到了同样的问题,虽然 Marc 的回答确实帮助我了解出了什么问题,但它并没有解决我的问题。重建没有帮助,在这种情况下我没有使用序列化。

      原来我的问题正在发生,因为我的项目有一个对自身的引用(不太确定这是怎么发生的,也许 Resharper 在我没有注意到的情况下添加了引用?),它正在将 .cs 文件与编译的 .dll 文件进行比较.我只是删除了引用。

      希望这可以帮助遇到同样问题的其他人!

      【讨论】:

        【解决方案5】:

        在尝试了以上所有方法之后,清理、重建、删除/重新添加引用和编辑设计器文件 - 最后只需关闭 Visual Studio 并重新打开项目,一切都会变得更好。

        tl;博士

        尝试将其关闭然后重新打开。

        【讨论】:

          【解决方案6】:

          指示的类型可能具有相同的名称、相同的命名空间和相同的程序集 (DLL),但位于不同的版本或位置。

          您可以在您所指的这两个对象上尝试以下代码来定义它们的程序集的位置。

          SampleObject.GetType().Assembly.CodeBase
          

          【讨论】:

            【解决方案7】:

            我遇到了和你一样的错误,但对我来说删除 resx 文件有效。

            【讨论】:

              【解决方案8】:

              我遇到了同样的错误,我尝试了上面的一些解决方案,但没有任何效果,然后我删除了resx file中我的属性的数据标签的值标签的内容。

              例如,如果在MyUserControl 用户控件中产生错误的属性是MyProp,您将在resx file 中找到名称为MyUserControl.MyProp 的数据标签,删除其值标签的内容。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-10-05
                • 1970-01-01
                • 1970-01-01
                • 2017-09-08
                • 1970-01-01
                • 1970-01-01
                • 2023-03-22
                相关资源
                最近更新 更多