1

如果我做:

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

4 回答 4

6

因为强制转换不会创建新对象 - 它只是“重新键入” *现有对象,因此您可以以不同的方式使用它。不涉及任何建设。

您可以将 aCat视为泛型Animal,但它不会创建“新” Cat。另外,它仍然是一个Cat- 你只是在与它交互,就像它是一个通用的Animal.

反过来也可能是正确的——如果有人给你一个Animal你可以与之互动的东西。您可以尝试将其视为 a 进行交互Cat,但如果它真的是 a Dog,则您不能(合法地)将其视为 a Cat

* 重新输入我的意思是改变你认为对象的类型——对象的基础类型不会改变。

于 2013-01-30T14:03:33.223 回答
1

您不创建新对象:实例保持不变。仅修改引用您的实例的变量的类型。

于 2013-01-30T14:05:16.377 回答
0

Object构造函数仅在使用 .Net 语言创建新实例时调用,而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
于 2013-01-30T14:08:26.500 回答
0

如果您想要与第一段相同的功能,您的第二段代码应该是这样的:

IList<WSACLI_ComunicazionePersonale> Comunicazioni = m_oNode
    .SelectNodes("m_Detail_Row")
    .Select(n=> new WSACLI_ComunicazionePersonale(n))
    .ToList();

没有强制转换,因为您无法将节点强制转换为您的对象。在您的第一个示例中,您创建了一个新实例并将节点传递给构造函数。

于 2013-01-30T14:06:04.670 回答