如果我这样做:
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()
不调用构造函数?
因为强制转换不会创建新对象 - 它只是"重新键入"*现有对象,以便您可以以不同的方式使用它。 不涉及施工。
您可以将Cat
视为泛型Animal
,但它不会创建"新"Cat
。 另外,它仍然是一个Cat
- 你只是与它互动,就像它是一个通用的Animal
一样。
反之亦然——如果有人给你一个Animal
你可以与之互动。 你可以尝试像Cat
一样交互它,但如果它真的是一个Dog
,你不能(合法地)把它当作一个Cat
。
* 通过重新键入,我的意思是更改您认为对象的类型 - 对象的基础类型不会更改。
您不会创建新对象:实例保持不变。仅修改引用实例的变量的类型。
如果你想要与第一段代码相同的功能,你的第二段代码应该读成这样:
IList<WSACLI_ComunicazionePersonale> Comunicazioni = m_oNode
.SelectNodes("m_Detail_Row")
.Select(n=> new WSACLI_ComunicazionePersonale(n))
.ToList();
没有强制转换,因为您无法将节点强制转换为对象。在第一个示例中,您创建了一个新实例并将节点传递给构造函数。
构造函数仅在使用 .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