'对象'不包含定义

时间:2014-08-25 02:05:18

标签: c#

为什么会出现此错误?这是代码:

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属性?

2 个答案:

答案 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可以执行的任何操作(具有方法GetHashCodeEquals,和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属性。