"类型安全"和"强类型"是否意味着同样的事情?

Won*_*ing 29 c# types

"类型安全"和"强类型"是否意味着同样的事情?

Jon*_*eet 25

不,不一定 - 虽然这取决于您对术语的定义,但没有非常明确和广泛接受的定义.

例如,动态编程语言通常是类型安全的,但不是强类型的.换句话说,没有编译时类型信息确定您可以和不能对类型执行什么操作,但在执行时,运行时会确保您不使用一种类型,就好像它是另一种类型一样.

例如,在C#4.0中,您可以执行以下操作:

dynamic foo = "hello";
dynamic length = foo.Length; // Uses String.Length at execution time
foo = new int[] { 10, 20, 30 };
length = foo.Length; // Uses Array.Length at execution time
dynamic bar = (FileStream) foo; // Fails!
Run Code Online (Sandbox Code Playgroud)

最后一行是它是类型安全的关键:没有从int数组到a的安全转换FileStream,因此操作失败 - 而不是将数组对象的字节视为 a FileStream.

编辑:C#通常都是"强类型"(作为一种语言)和类型安全:编译器不会让你尝试对一个对象进行任意调用,运行时不会让你执行不适当的转换.

我不完全确定哪些不安全的代码适合 - 我不太了解它的评论,我害怕.

C#4中的动态类型允许弱类型但仍然是类型安全的代码,如上所示.

请注意,foreach执行隐式转换,使其成为一种混合:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这将编译(最近有另一个问题)但在执行时会失败.具有讽刺意味的是,这是因为你试图stream变量进行强类型化,这意味着你必须对迭代器的结果执行强制转换.