为什么会出现此错误?这是代码:
MyClass item = new MyClass{ id=1 };
List<object> items = new List<object>();
items.Add(item);
object getitem = items[0];
int itemid = getitem.id; // <-error
在调试器中,getitem
对象显示为具有id
属性,但我无法在不出现此错误的情况下提取它。如何从此对象中提取id
属性?
答案 0 :(得分:6)
编译器不知道getitem
中包含的实际对象是MyClass
类型,因为您已经告诉它期望一个对象,这可能只是任何东西。想象一下,你做了这件事:
List<object> items = new List<object>();
items.Add( "Hello, World!" );
object getitem = items[0];
int itemid = getitem.id; // <-error
string
也是一个对象,因此将它放在List<object>
中是完全合理的。实际上,任何事物都可以放入一个对象中,因此编译器只能保证object
可以执行的任何操作(具有方法GetHashCode
,Equals
,和ToString
)。
考虑使您的列表更具体:
MyClass item = new MyClass{ id=1 };
List<MyClass> items = new List<MyClass>();
items.Add( item );
MyClass getitem = items[0];
int itemid = getitem.id;
如果这不是一个可接受的解决方案,那么你需要从列表中转换结果,以便编译器知道它实际上正在处理MyClass
的实例:
MyClass getitem = (MyClass) items[0];
int itemid = getitem.id;
答案 1 :(得分:3)
调试器足够聪明,可以知道getitem的实际类型,并显示属性。如果您将其更改为:
MyClass getitem = (MyClass) items[0];
它适合你。你正在做的是将对象实例转换为MyClass类型,以便编译器知道它具有id属性。