JavaScript是一种动态类型语言,而C#通常是一种静态类型语言。因此,像这样的比较总是会有问题。但是:
JavaScript的 var
关键字有点类似于C#的 dynamic
关键字。两者都创建一个在运行时不知道其类型的变量,并且其误用直到运行时才会被发现。这是JavaScript的一贯做法,但这种行为对于C# 4来说是全新的。
dynamic foo = new DateTime();
foo.bar(); //compiles fine but blows up at runtime.
JavaScript没有像C#的var
那样的匹配项,因为JavaScript是一种动态类型语言,而C#的var
(尽管有流行的误解)创建一个在编译时已知类型的变量。 C#的var
有两个用途:声明类型难以书写的变量,并创建匿名类型变量,因此开发人员无法书写其类型。
对于第一个例子:
var conn = new System.Data.SqlClient.SqlConnection("....");
Linq-to-Sql或Entity Framework中的匿名类型投影是第二个例子的很好体现:
var results = context.People.Where(p => p.Name == "Adam")
.Select(p => new { p.Name, p.Address })
这里的results
是IQueryable<SomeTypeTheCompilerCreatedOnTheFly>
类型。无论你多么想写出结果的实际类型而不是只写var
,但由于你不知道编译器为匿名类型在底层创建的类型,因此没有办法。因此,这种类型被称为匿名。
在这两种情况下,类型在编译时已知,随后说:
conn = new DateTime();
或者
results = new DateTime();
会导致编译错误,因为您正在将conn
和results
设置为与它们声明为不兼容的类型。