Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# F#like(+;)、(>;)、(<;)中的某些二进制运算符只接受必须是相同类型的参数,这有什么特殊原因吗?_C#_.net_.net Core_F# - Fatal编程技术网

C# F#like(+;)、(>;)、(<;)中的某些二进制运算符只接受必须是相同类型的参数,这有什么特殊原因吗?

C# F#like(+;)、(>;)、(<;)中的某些二进制运算符只接受必须是相同类型的参数,这有什么特殊原因吗?,c#,.net,.net-core,f#,C#,.net,.net Core,F#,像C#这样的语言允许我们编写如下代码: // C# Console.WriteLine($"{3 > 2.3}"); // compare an int with a double 但是F#不允许我们这样做。比如说, // F# printfn "%A" (3 > 4) // fine printfn "%A" (3.0 > 4.0) // fine printfn "%A" (3 > 4.0) // wrong

C#
这样的语言允许我们编写如下代码:

// C#
Console.WriteLine($"{3 > 2.3}"); // compare an int with a double
但是
F#
不允许我们这样做。比如说,

// F#
printfn "%A" (3 > 4)            // fine
printfn "%A" (3.0 > 4.0)        // fine
printfn "%A" (3 > 4.0)          // wrong 
F#
中的一些二进制运算符如
(+)
(>)
(F#不进行隐式类型转换。隐式转换会产生问题,这也是为什么这么多人对javascript有复杂情绪的部分原因。例如,请欣赏这首经典的javascript诗。隐式转换是这首诗得以实现的基础

> Array(16).join('wat' - 1) + ' Batman'
'NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN Batman'

什么是3>“4”,那么“4”呢>3?您可能对这些问题有一些答案,这些答案对您来说很有意义,但是有很多有效的方法来解释隐式转换应该是什么。3>4.0时,这里的模糊性可能不那么明显,但是当您有显式转换的驱动哲学时,最好普遍应用它。

在C中,这些运算符也接受参数相同类型的计数器。但在C#中有神奇的(即自动)类型转换。当您编写
3>2.3
时,编译器插入一个转换
((双)3)>2.3
,但你看不到它。这是一个源代码或许多错误。我总是喜欢指出C语言设计师的错误。从向后兼容性的角度来看,隐式转换是一个巨大的问题,这使得a)很难理解API实际是如何使用的,b)在新的方向上发展api。你可以在F#中定义你想要的操作符。但一般来说,在函数式编程中,当类型在编译时检测到程序的正确性问题(而不仅仅是语法的正确性)时,您希望非常明确地了解类型。这就是为什么当你编译F#程序时,你会对它第一次运行感到惊喜的原因