如果我有一个名为
concat
的函数,可以接受任何对象,那么这是否被认为是弱类型语言?function concat(Object stuff)
{
//do something here to stuff
}
concat
的函数,可以接受任何对象,那么这是否被认为是弱类型语言?function concat(Object stuff)
{
//do something here to stuff
}
来自 http://ericlippert.com/2012/10/15/is-c-a-strongly-typed-or-a-weakly-typed-language/
C#是强类型语言还是弱类型语言?
是的。
这并没有帮助。
我不怀疑。有趣的是,如果你把问题重述为“并且”问题,答案将是一样的。
什么?你的意思是,C#既是强类型语言又是弱类型语言?
是的,C#是一种既是强类型语言又是弱类型语言的语言。
我困惑了。
我也是。或许你应该告诉我,“强类型”和“弱类型”具体指什么。
嗯,实际上我并不知道我用这些术语时具体指的是什么,所以也许那才是我应该问的问题。一个语言要成为“弱类型”或“强类型”,到底意味着什么?
“弱类型”意味着“这种语言使用了我认为不好的类型验证系统”,而“强类型”则意味着“这种语言使用了我认为好的类型系统”。
C#是一种强类型语言。
ECMA-334将C#定义为“C#(发音为“C Sharp”)是一种简单,现代,面向对象和类型安全的编程语言。”
维基百科定义类型安全:
类型安全与强类型之一的许多定义是同义词;但类型安全和动态类型是相互兼容的。
维基百科定义强类型:
在计算机科学和计算机编程中,当类型系统指定了一个或多个限制条件,规定不同数据类型的值可以如何交错使用时,该类型系统被称为具有强类型。弱类型则是其对立面。
或许更好的问题是,如果编译器进行类型检查,则C#是否是一种类型安全的语言,因为似乎没有人能就“强弱类型”的真正含义达成共识。
C#确实有一些类似于动态语言的构造可用,但令人惊讶的是,在编译时这些构造仍然是类型安全的。
从 Visual C#3.0 开始,声明在方法范围内的变量可以具有隐式类型
var
。 隐式类型的局部变量是强类型的,就像您自己声明了类型一样,但编译器会确定类型。
http://msdn.microsoft.com/en-us/library/bb383973.aspx
dynamic
关键字基本上是以与 var
不同的方式工作,因为它在运行时而不是在编译时进行评估。
Visual C# 2010 引入了一种新类型,即 dynamic。该类型是静态类型,但 dynamic 类型的对象绕过了静态类型检查。在大多数情况下,它的功能类似于具有 object 类型。在编译时,被标记为 dynamic 的元素被认为支持任何操作。
dynamic
时,您将删除所有有意义的静态类型,从而在使用时将其关闭。因此,虽然 C# 可以在保持静态类型的情况下使用,但是有许多违反静态类型的方法。其中一种是动态类型,另一种是 unsafe
代码,甚至基本转换也是违反静态类型的最简单、最容易的方式,因此 C# 不是一个完全静态类型的语言。 - Servy一般而言:C#通常以强类型方式被使用,这意味着一个变量会被声明为一个特定的Type
(例如:string、int、用户自定义类型等),且后续不能将其赋值为不同类型的值。
例如:在C#中无法这样做:
int i = 10;
i = "ten";
如下评论所述,C#可以有不同的使用方式。
使用“强类型”让编辑器/编译器提醒您错误,并让编辑器为您提供可能需要的缩小范围的建议。
object
,C#也是部分强类型的 - 你不能简单地引用变量的属性。例如,你不能设置object i = "ten";
然后获取i.Length
。 - ispirodynamic
,就可以这样做。同样,你可以使用强制类型转换来告诉编译器从 i
中的对象获取 Length
属性。事实上,强制类型转换本质上违反了强类型的特性。它的整个目的就是允许你违反编译器的类型系统。 - Servy这里有一篇博客文章,作者曾是C#编译器的主要开发者(在他写这篇文章的时候)。
简而言之,问题本身存在缺陷,无法以其当前的形式合理回答。
foreach
循环,它适用于任何具有GetEnumerator
方法的对象。 - Servyawait
。 - Marc Gravellforeach
不需要这些接口。这些接口保证这些签名,但即使没有它们,该功能也可以正常工作。 - Marc Gravellforeach
)就是这种情况,甚至可能在此之前(我手头没有 1.0 规范)。LINQ 是在 3.5 中引入的。 - Marc Gravelldynamic
,再往后就是在 unsafe
代码中所能完成的一切,可以完全摧毁对于托管代码程序状态所做出的任何假设。 - Servy