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



如果我这样做:

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

相关内容

  • 没有找到相关文章

最新更新