因为我不熟悉隐式类型;你能告诉我之间的主要区别:
var foo = new Love();
和
object foo = new Love();
因为我不熟悉隐式类型;你能告诉我之间的主要区别:
var foo = new Love();
和
object foo = new Love();
在第一种情况下,类型foo
是Love
。在第二种情况下是object
。
var foo = new Love();
这里,变量的静态foo
类型是Love
。相当于写Love foo = new Love();
。
object foo = new Love();
这里,变量的静态foo
类型是object
。如果不先使用演员表,您将无法访问 Love 的任何方法。
的动态类型(或运行时类型)在这两种情况下foo
都是Love
,这就是为什么两者GetType
都会返回Love
。
使用var
,编译器根据赋值运算符右侧的表达式推断变量的类型。
换句话说,
var foo = new Love();
完全等同于
Love foo = new Love();
所以所有的成员Love
都可以通过foo
- 而如果foo
被声明为 type ,object
你只能访问GetHashCode()
,ToString()
和.GetType()
Equals()
使用var
,您仍在使用静态类型(而不是dynamic
在 C# 4 中使用)。您只是没有明确说明变量的类型 - 您让编译器为您解决问题。但是,它确实需要是编译器可以计算出来的类型。例如,这些都是无效的:
// 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
在这些情况下,编译器没有足够的信息来确定您的意思是哪种类型。
var foo = new Love();
这里等于
Love foo = new Love();
有时我们可以var
用来避免长类名,例如Dictionary<string,Dictionary<int,string>>.
您可以使用类 Love 的所有方法/属性。
object foo = new Love();
现在 foo 被认为是一个对象,你看不到 Love 类的任何方法/属性,但你可以将它转换回来。