1

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

例如,我正在使用中继器。作为其中的一部分,我正在操作 DataSource 属性。为此,我必须首先检查以下内容:

this.DataSource as List<MyObject>

如果它不是 MyObject 对象的列表,这将返回 null。如果我转换它,并且它不是 MyObject 对象的列表,它将引发异常。

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

问题

那么为什么不让我使用 this.DataSource 进行编码,因为它已经是已知的类型呢?喜欢:

this.DataSource.First().Member

这个问题显然没有什么花言巧语,我并不是暗示我应该能够做到这一点,我真的对答案很感兴趣。

4

2 回答 2

8

C# 是一种静态类型语言。这是故意的。静态类型在可维护性、工具、性能和可能的其他方面也有好处。

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

静态类型和动态类型之间的权衡很复杂,我无法在此答案中详细说明。它已在网络上的许多地方进行了广泛讨论。

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

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

我建议您尽可能地利用静态类型的力量。dynamic更多的是特殊情况下的逃生舱。

于 2013-11-11T13:37:26.310 回答
3

因为Repeater.DataSource被定义为一个object,最基本的类。

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

于 2013-11-11T13:36:02.837 回答