为什么Cast()不调用构造函数?

时间:2013-01-30 14:00:20

标签: c# xml linq list casting

如果我这样做:

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()没有调用构造函数?

4 个答案:

答案 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