2

私は暗黙のタイピングに慣れていないので、主な違いを教えてください。

 var foo = new Love(); 

object foo = new Love();
4

4 に答える 4

16

最初のケースでは、 のタイプはfooですLove。2 番目の場合は ですobject

于 2010-09-01T08:41:30.927 に答える
11
var foo = new Love(); 

ここで、変数の静的foo型はLove. と同等Love foo = new Love();です。

object foo = new Love();

ここで、変数の静的foo型はobject. 最初にキャストを使用しないと、Love のメソッドにアクセスできません。

動的型 (または実行時型)fooLove両方の場合にあるため、両方に対してGetType返さLoveれます。

于 2010-09-01T08:41:52.533 に答える
6

を使用varすると、コンパイルは代入演算子の右側の式に基づいて変数の型を推測します。

言い換えると、

var foo = new Love();

まったく同等です

Love foo = new Love();

したがって、 のすべてのメンバーは-Loveを介して利用できますが、タイプが であると宣言されている場合は、 、、およびにしかアクセスできません。foofooobjectGetHashCode()ToString()GetType()Equals()

では、( C# 4 でのvar使用とは対照的に) 静的型付けを引き続き使用しています。dynamic変数の型を明示的に述べているわけではありません-コンパイラーにそれを解決させています。ただし、コンパイラが処理できる型である必要があります。たとえば、これらはすべて無効です。

// All invalid
var a = null;
var b = delegate() { Console.WriteLine("Hello"); };
var c = x => Console.WriteLine("lambda: " + x);
var d = MethodName; // Attempted method group conversion

これらの場合、コンパイラは、どのタイプを意味するかを判断するのに十分な情報を持っていません。

于 2010-09-01T08:42:54.590 に答える
2
var foo = new Love();

ここでは等しい

Love foo = new Love();

var長いクラス名を避けるために使用できる場合があります。たとえばDictionary<string,Dictionary<int,string>>.、クラス Love のすべてのメソッド/プロパティを使用できます。

object foo = new Love();

これで、foo はオブジェクトと見なされます。クラス Love のメソッド/プロパティは表示されませんが、元に戻すことはできます。

于 2010-09-01T08:45:03.040 に答える