如果我这样做:
IList<WSACLI_ComunicazionePersonale> Comunicazioni = (from XmlNode n in m_oNode.SelectNodes("m_Detail_Row")
select new WSACLI_ComunicazionePersonale(n)).ToList();
它完美无缺,构建我的WSACLI_ComunicazionePersonale
对象列表!
但是,如果我这样做:
IList<WSACLI_ComunicazionePersonale> Comunicazioni = m_oNode.SelectNodes("m_Detail_Row").Cast<WSACLI_ComunicazionePersonale>().ToList();
列表为null
。似乎Cast()
没有调用构造函数?
答案 0 :(得分:6)
因为强制转换不会创建新对象 - 它只是“重新键入” * 现有对象,因此您可以以不同的方式使用它。没有涉及施工。
您可以将Cat
视为通用Animal
,但不会创建“新”Cat
。另外,它仍然是Cat
- 您只是与交互,就像它是通用的Animal
一样。
反向可能也是如此 - 如果有人给你Animal
,你可以与之互动就是这样。您可以尝试进行互动,就像它是Cat
一样,但如果真的是Dog
,则不能(合法地)将其视为Cat
。
*通过重新输入我的意思是改变你正在考虑对象的类型 - 对象的基础类型不会改变。
答案 1 :(得分:1)
您不创建新对象:实例保持不变。仅修改引用您的实例的变量的类型。
答案 2 :(得分:0)
如果你想要与第一段代码相同的功能,你的第二段代码应该是这样的:
IList<WSACLI_ComunicazionePersonale> Comunicazioni = m_oNode
.SelectNodes("m_Detail_Row")
.Select(n=> new WSACLI_ComunicazionePersonale(n))
.ToList();
没有强制转换,因为您无法将节点强制转换为对象。在第一个示例中,您创建了一个新实例并将该节点传递给构造函数。
答案 3 :(得分:0)
只有在.Net语言中创建Object
的新实例时才会调用构造函数,而Casting (Type Casting)
是一种将对象的现有类型更改为不同类型的方法
类型转换(在维基百科上)
在计算机科学中,类型转换,类型转换和强制是 改变一个实体的隐含或明确的不同方式 数据类型转换为另一种这样做是为了利用某些优势 类型层次结构或类型表示的功能。一个例子 将是小整数,可以以紧凑的格式存储 在算术中使用时转换为更大的表示 计算。在面向对象的编程中,类型转换允许 程序将一种类型的对象视为其祖先类型之一 简化与他们的互动。
Animal animal = new Cat();
Bulldog b = (Bulldog) animal; // if (animal is Bulldog), stat.type(animal) is Bulldog, else an exception
b = animal as Bulldog; // if (animal is Bulldog), b = (Bulldog) animal, else b = null
animal = null;
b = animal as Bulldog; // b == null