为什么"int + string"在静态类型的C#中是可能的,而在动态类型的Python中却不行?

Sal*_*ali 10 c# python types

在研究C#时我发现它很奇怪,动态类型的Python会在以下代码中出现错误:

i = 5
print i + " "
Run Code Online (Sandbox Code Playgroud)

而静态类型的C#通常会进行类似的代码:

int i = 5;
Console.Write(i + " ");
Run Code Online (Sandbox Code Playgroud)

我希望有其他方法(在python中,我可以在没有任何强制转换的情况下执行此操作,但C#将要求我将int转换为string或string转换为int).

只是为了强调,我不是在问什么语言更好,我很好奇是用这种方式实现语言的原因是什么.

Eri*_*ert 23

你是对的,这里的事情很奇怪.奇怪的是,这+意味着任何一种语言的字符串连接!是否+可以将int连接到字符串上是一个小点,与+意味着"连接" 的奇怪性相比.

我不知道哪种语言首先被允许+用于表示字符串连接,但是这种错误一再被重复,所以现在我们通常甚至都没有注意到它是多么奇怪.让我们列出正常添加的一些属性,看看字符串是否正常.

  • 加法是可交换的,但字符串连接不是.x + y!= y + x
  • 添加是关联的,但C#中的字符串连接不是.如果y和z是整数,则(x + y)+ z不必等于x +(y + z).
  • 加法与逆运算,减法配对,其特性是如果x + y是z则z-y是x.字符串没有这样的操作.
  • 添加具有左右标识,字符串连接也是如此.(空字符串).

四分之一不好.字符串连接与添加非常不同,那么它们为什么要共享一个运算符呢?

我不经常说这个,但C说得对.字符串连接运算符应该只是:连接.用C "X" "Y"表示"XY".如果你把两个字符串文字放在一起,它们会连接成第三个.


Kon*_*lph 9

这实际上不是静态与动态类型的区域.相反,它是强类型类型(至少根据一些常用的术语,维基百科也恰好在其编程语言的表征中使用).C#和Python都是强类型的(按照定义).

遗憾的是,所有这些概念都不是黑白的,而是灰度级的,并且定义不明确.然而,结果是,有一种语言是多么强烈进行类型检查的细微差别,并且检查它执行.

恰巧在你的特殊情况下,C#会重载operator +字符串和数字(​​实际上是任意对象),而Python则没有.在这种情况下,这可以说使Python稍微严格一些.

  • 在这种背景下,"强"和"弱"的含义尚不清楚; 由于维基百科列出了"强类型"的十一个(一些相互矛盾的)含义,我发现最好完全避免这个术语.而且:说C#允许+对字符串和对象更准确; 整数只是对象的特例. (3认同)

kin*_*all 9

这不是一个静态/动态的问题,而是语言设计哲学的问题.

在Python中,+被定义为数字的加法和字符串的连接.如果您有一点编程经验,这是非常合理的行为.

但是当你有一个时,会发生什么?它是否尝试将字符串转换为数字,还是将数字转换为字符串?对于任何完成任何编程的人来说,这两者都是完全合理的行为,但由于不同的语言对于这种情况的发生方式有不同的规则,因此根据您使用的语言,您可能会做出与其他人不同的假设.已经.

Python的指导原则之一是"显式优于隐式"(import this),因此它可以明确说明您想要的行为.怎么样?当然,通过将字符串或数字转换为所需的类型.然后它们都是字符串或两个数字,行为是显而易见的.

生成的代码更容易阅读(即使你不太了解Python),因为你不必猜测它会做什么.