通过手动,我的意思是代码,好像我需要满足,好像对象不是我期望的那样。
例如,我正在使用转发器。作为其中的一部分,我正在操纵DataSource属性。要做到这一点,我必须先检查以下内容:
this.DataSource as List<MyObject>
如果它不是MyObject对象的List,则返回null。如果我转换它,并且它不是MyObject对象的List,它将抛出异常。
这意味着此时已知它是否是MyObject对象的列表。
问题
那么为什么不让我用this.DataSource进行编码,因为它已经知道它已经是那种类型了?像:
this.DataSource.First().Member
这个问题显然没有任何修辞,我并不是说我应该能够做到这一点,我真的对这个问题感兴趣。
答案 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
,所以是最基本的类。
编译器不知道你放在那里的具体类型,所以如果你想要静态类型访问它,你需要强制转换它。