暗黙的なタイピング;なぜローカル変数なのか?
-
05-07-2019 - |
質問
暗黙の型付けがローカル変数に制限されている理由を推測する人はいますか?
var thingy = new Foo();
しかし、なぜ...
var getFoo() {
return new Foo();
}
解決
Eric Lippertは、このテーマに関するブログ投稿全体を行いました。
要約すると、主な問題は、C#コンパイラを大幅に再構築する必要があることです。宣言は現在、シングルパス方式で処理されます。推定された変数間のサイクルを形成できるため、これには複数のパスが必要になります。 VB.netにはほぼ同じ問題があります。
他のヒント
Jaredの回答には、素晴らしいトピックへの素晴らしいリンクがあります。
質問に明示的に回答していないと思います。
しない理由
var getFoo() {
return new Foo();
}
この理由は次のとおりです。
What if?
class Foo {}
var GetFoo() {
return GetBar();
}
var GetBar() {
return GetBaz();
}
var GetBaz() {
return new Foo();
}
GetFoo
は Foo
を返すと推測できますが、メソッドが行う呼び出しとそのすべてをトレースする必要があります。 子供はタイプを推測するだけです。現状では、C#コンパイラはこのように動作するようには設計されていません。型を推測するコードを実行するには、プロセスの早い段階でメソッドとフィールドの型が必要です。
純粋に美的なレベルでは、メソッドのvar定義が物事を混乱させることがわかります。私が明示的に常にであると思う1つの場所は、あなたの署名と他の多くの依存するメソッドの署名を変更させるタイプを誤って返すことにより、自分の足を撃つことからあなたを守ります。最悪の場合、オブジェクトを返すメソッドの値を返し、偶然ラッキーだった場合、そのことを知らなくてもメソッドチェーンのすべてのシグネチャを変更する可能性があります。
Rubyのような動的言語にはvarメソッドが最適だと思います
それははるかに簡単だからです。すべての型を推論する場合、最愛のC#をHaskel派生言語にするHindley Milner型推論システムなどが必要になります。
本質的に、あなたが実行している問題は、C#(これまでのところ)が静的に型付けされた言語であるということです。 varとして定義されたローカル変数はまだ静的に型付けされていますが、構文的には隠されています。一方、varを返すメソッドには多くの意味があります。これは使用のためのインターフェースになり、varを使用しても何も得られません。
2010で使用できる動的
Dynamic getFoo() {
return new Foo();
}
その暗黙の型のスコープがはるかに広いため、単一のメソッドのスコープ内よりも問題を引き起こす可能性が高いためだと思います。