为什么有必要“手动”评估或转换对象的类型?

时间:2013-11-11 13:33:53

标签: c# object types .net-4.0 casting

通过手动,我的意思是代码,好像我需要满足,好像对象不是我期望的那样。

例如,我正在使用转发器。作为其中的一部分,我正在操纵DataSource属性。要做到这一点,我必须先检查以下内容:

this.DataSource as List<MyObject>

如果它不是MyObject对象的List,则返回null。如果我转换它,并且它不是MyObject对象的List,它将抛出异常。

这意味着此时已知它是否是MyObject对象的列表。

问题

那么为什么不让我用this.DataSource进行编码,因为它已经知道它已经是那种类型了?像:

this.DataSource.First().Member

这个问题显然没有任何修辞,我并不是说我应该能够做到这一点,我真的对这个问题感兴趣。

2 个答案:

答案 0 :(得分:8)

C#是一种静态类型语言。这是故意的。静态类型有利于可维护性,工具,性能以及可能的其他方面。

在动态类型语言中,您确实可以编写此类代码。确实可以像这样定义C#语言,但选择它不是。

静态和动态类型之间的权衡是复杂的,我不能在这个答案中完全阐述它。它已在很多地方在网上广泛讨论过。

从C#4开始,您也可以强制使用动态语义:

dynamic ds = this.DataSource;
Console.WriteLine(ds.First().Member); //compiles and works or fails at runtime

我建议您尽可能利用静态输入的强大功能。 dynamic更适合特殊情况的逃生舱。

答案 1 :(得分:3)

因为Repeater.DataSource被定义为object,所以是最基本的类。

编译器不知道你放在那里的具体类型,所以如果你想要静态类型访问它,你需要强制转换它。