7

采取以下代码:

IFoo foo = new FooImplementation();

标识符foo有两种类型:

  1. IFoo- 这是编译器将强制执行的类型。我将只能调用属于IFoo合同一部分的方法,否则会出现编译器错误。
  2. FooImplementation- 这是运行时已知的类型。我可以在运行时向下转换foo为 a FooImplementation,然后调用FooImplementation.

我的问题:这两种类型的正确术语是什么。我可以在学校发誓,我们被教导这IFoo是标识符的静态类型动态类型,但在谷歌上进行大量搜索后,我似乎找不到任何对此的参考。FooImplementation

4

3 回答 3

7

我会分别调用编译时和运行时类型IFooFooImplementationC# 规范使用这种语言,例如,在谈论虚拟方法时(第 1.6.6.4 节):

调用虚拟方法时,发生该调用的实例的运行时类型决定了要调用的实际方法实现。在非虚拟方法调用中,实例的编译时类型是决定因素。

于 2013-01-28T23:55:28.340 回答
5

我同意 Mike Z 的观点。C# 中的常用术语是“编译时类型”和“运行时类型”。

“静态类型”和“动态类型”是完全合理的术语,但我会在 C# 的上下文中避免使用它们。“静态类型”很容易与“静态类”混淆,“静态类”是一个只能包含静态方法的类。而且“动态类型”很容易与 C# 4 中添加的动态类型特性相混淆。

于 2013-01-29T01:24:38.163 回答
4

第一个是声明类型。第二个是具体类型。

……至少我是这么称呼他们的。

于 2013-01-28T23:49:52.017 回答