23

暗黙の型付けがローカル変数に限定されている理由を知っている、または推測したい人はいますか?

var thingy = new Foo();

しかし、なぜ...

var getFoo() {
    return new Foo(); 
}
4

6 に答える 6

43

Eric Lippert は、このテーマに関するブログ投稿全体を行いました。

要約すると、主な問題は、そのためには C# コンパイラの大幅な再アーキテクチャが必要になることです。宣言は現在、シングル パス方式で処理されます。これには、推論された変数間でサイクルを形成する機能があるため、複数のパスが必要になります。VB.NET にもほぼ同じ問題があります。

于 2009-05-05T13:01:21.993 に答える
7

Jared の回答には、素晴らしいトピックへの素晴らしいリンクがあります。

質問に明確に答えていないと思います。

なぜだめですか?

var getFoo() {
    return new Foo(); 
}

その理由は次のとおりです。

仮に?

class Foo {}

var GetFoo() {
   return GetBar(); 
}

var GetBar() {
  return GetBaz(); 
}

var GetBaz() {
   return new Foo();
}

GetFooが返されると推測できますが、型を推測するためだけにメソッドとその子が行うすべてFooの呼び出しをトレースする必要があります。現状では、C# コンパイラはこのように動作するようには設計されていません。型を推測するコードを実行する前に、プロセスの早い段階でメソッドとフィールドの型が必要です。

純粋に審美的なレベルでは、メソッドの var 定義が物事を混乱させていることがわかります。明示的であることが常に役立つと私が思う1つの場所は、署名や他の多くの依存メソッド署名を変更する原因となる型を誤って返すことで、自分自身を撃つことから保護します. さらに悪いことに、オブジェクトを返すメソッドの値を返し、たまたま運が良ければ、メソッドチェーンのすべてのシグネチャを変更したことを知らずに変更する可能性があります。

var メソッドは、Ruby のような動的言語に残すのが最善だと思います

于 2009-05-05T14:30:35.370 に答える
1

vs2010Dynamicで使用できます

Dynamic getFoo() { 
    return new Foo();  
} 
于 2010-05-05T11:41:23.660 に答える
1

基本的に、あなたが直面している問題は、C#(これまでのところ)が静的に型付けされた言語であるということです。varとして定義されたローカル変数は静的に型付けされますが、構文的には非表示になります。一方、varを返すメソッドには、多くの意味があります。それは使用のためのより多くのインターフェースになり、varを使用しても何も得られません。

于 2009-05-05T13:23:15.263 に答える
1

その方がはるかに簡単だからです。すべての型を推論する場合、最愛の C# を Haskel 派生言語にする Hindley Milner 型推論システムのようなものが必要になります。

于 2009-05-05T13:04:17.713 に答える
0

その暗黙の型のスコープははるかに広いため、単一のメソッドのスコープ内よりも問題が発生する可能性が高いためだと思います。

于 2009-05-05T13:02:01.570 に答える