1.返回的是Object型,你要的是StringIntObject.i,只是这个Object的成员,当然不一样
2.(StringIntObject)cmbTextAlign.SelectedItem是重建类型,因为返回的是Object类型而不是StringIntObject类型,所以要转换回去。所有的用户类都是从Object继承来的,是引用类型,返回的Object句柄只能访问Object的方法,但是内存中的对象实际上还是完整的StringIntObject。

解决方案 »

  1.   

    1.我要的只是int型啊,为什么要绕一个弯用StringIntObject.i(它实际也是一个int型)
    2.我还是没懂((StringIntObject)cmbTextAlign.SelectedItem).i和StringIntObject.i有什么不同
      

  2.   

    1.不是不能用,是因为SelectedItem不是一个int型,肯定会出错。
      可以用  if (cmbTextAlign.SelectedItem is int) 来判断  如果是一个int类型的变量,就可以这么强制转换。2.对于引用类型,object可以强制转换为任何引用类型(对象),但如果转换前后的类型不兼容,使用原类型不存在的成员会出现异常。强制转换只是编译器进行语法检查时用的,内存没有什么变化。
      

  3.   

    那假如StringIntObject里的2个变量都是int型的呢?
      

  4.   

    你的StringIntObject.i是一个int不错,但你的cmbTextAlign.SelectedItem只是一个object,在实际运行中它确实是一个StringIntObject,但在进行语法检查时编译器并不知道它是一个StringIntObject,只知道它是一个object,所以不能使用StringIntObject.i 成员。经过强制转换后,编译器认为你把这个object当成一个StringIntObject来用了,只要实际的cmbTextAlign.SelectedItem跟StringIntObject兼容,就可以引用其成员 i 了,否则出现异常。
      

  5.   

    引用jupiterll():
    那假如StringIntObject里的2个变量都是int型的呢?
      

  6.   

    SelectedItem 是一个Item类型,
    SelectedIndex不就可以了吗?如果有的话,呵呵
      

  7.   

    引用jupiterll():
    那假如StringIntObject里的2个变量都是int型的呢?