7

次のコードを使用します。

IFoo foo = new FooImplementation();

識別子fooには次の 2 つのタイプがあります。

  1. IFoo- これは、コンパイラが強制する型です。コントラクトの一部であるメソッドのみを呼び出すことができIFooます。そうしないと、コンパイラ エラーが発生します。
  2. FooImplementation- これは、ランタイムによって認識されるタイプです。実行時に にダウンキャストfooしてから、 のFooImplementation非 IFoo メソッドを呼び出すことができますFooImplementation

私の質問:これら 2 つのタイプの適切な用語は何ですか。私は学校でそれが識別子のstatic typeであり、そのdynamic typeであると教えられたことを誓うことができますが、Googleで多くの検索を行った後、これへの参照が見つからないようです。IFooFooImplementation

4

3 に答える 3

7

コンパイル時型と実行時型をそれぞれIFoo呼び出します。FooImplementationこの言語は、たとえば、仮想メソッドについて話すときに C# 仕様で使用されます (セクション 1.6.6.4)。

仮想メソッドが呼び出されると、その呼び出しが行われるインスタンスの実行時の型によって、呼び出す実際のメソッドの実装が決まります。非仮想メソッド呼び出しでは、インスタンスのコンパイル時の型が決定要因になります。

于 2013-01-28T23:55:28.340 に答える
5

Mike Z に同意します。C# での通常の用語は、「コンパイル時の型」と「実行時の型」です。

「静的型」と「動的型」は完全に合理的な用語ですが、C# のコンテキストでは避けます。「静的型」は、静的メソッドのみを含むクラスである「静的クラス」と簡単に混同される可能性があります。また、「動的型」は、C# 4 に追加された動的型機能と簡単に混同される可能性があります。

于 2013-01-29T01:24:38.163 に答える
4

1 つ目は宣言型です。2 つ目はコンクリート タイプです。

...少なくとも私はそう呼んでいます。

于 2013-01-28T23:49:52.017 に答える