C# Scala和C中的隐式转换#

C# Scala和C中的隐式转换#,c#,scala,implicit,explicit,C#,Scala,Implicit,Explicit,隐式转换似乎是Scala的一个主要且有争议的特性,而它们在C#中的重要性似乎要小得多这两种语言的区别是什么?在Scala中是否有任何地方我被迫使用隐式转换,或者我是否可以始终选择是隐式转换还是显式转换,就像在C中一样?通常在C中,我喜欢显式转换,以便维护程序员意图的类型检查,即使使用者是我自己 我说的C#或Scala都不能隐式拆分或组合方法/函数参数对吗?就像def myMethod(v1:Int,v2:Int)中一样,不会接受一个Tuple2[Int,Int]作为其参数列表,def yourM

隐式转换似乎是Scala的一个主要且有争议的特性,而它们在C#中的重要性似乎要小得多这两种语言的区别是什么?在Scala中是否有任何地方我被迫使用隐式转换,或者我是否可以始终选择是隐式转换还是显式转换,就像在C中一样?通常在C中,我喜欢显式转换,以便维护程序员意图的类型检查,即使使用者是我自己


我说的C#或Scala都不能隐式拆分或组合方法/函数参数对吗?就像def myMethod(v1:Int,v2:Int)中一样,不会接受一个Tuple2[Int,Int]作为其参数列表,def yourMethod(v1:Tuple2[Int,Int])也不会接受两个Int作为其参数列表。语言设计者必须考虑隐式/显式参数拆分/组合。当使用多个但相似的图形库的点结构时,我确实发现这一特性是可取的。

Scala和C#隐式转换之间的关键区别在于Scala中更灵活的范围规则,它允许您定义哪些范围内的隐式转换以及哪些范围内的隐式转换可用

在C#中,隐式转换是一种表示一个类可以被视为另一个类的方式,而在Scala中,它允许您装饰类,只在特定的上下文中添加特定的特性

此外,虽然C#中的隐式转换需要在类本身中定义,但在Scala中,您可以在外部添加隐式转换,这是修饰现有类的强大工具:Scala提供了一组预定义的显式转换

主要和有争议的特点

不知何故,我错过了这场争论,所以我怀疑这是一场重大的争论

隐式转换是可用的,但根据具体情况,经验丰富的Scala开发人员通常不赞成隐式转换

当存在通过“扩展”类将方法添加到类型的隐式转换时,则接受该转换。此扩展类不是用作参数、定义或变量类型的类型,其方法也不会返回自身,而是原始类型(如果适用)

当隐式转换在程序中通常使用的两种类型之间进行转换时,它被认为是一件坏事。事实上,Scala2.10将附带针对此类使用的警告

可以在Java和Scala集合之间转换的两个可用包中清楚地看到这一区别:Scala.collection.JavaConversions和Scala.collection.JavaConverters。后者的存在正是因为前者中使用的隐式转换样式被认为是不好的

Scala确实允许您进行特定范围内不可用的隐式转换,但我很少看到使用它。另一方面,标志
-Xlog implicit conversions
允许您跟踪隐式转换发生的位置


Scala的默认作用域中没有太多隐式类型转换。
String
可以看作是
Seq[Char]
,并且“基本”数字类型具有类型加宽功能——即,较小的类型可以看作较大的类型。可能还有其他一些我现在不记得了,但是,一般来说,你必须导入隐式转换才能使用它。

+1最后一点——这才是真正的区别所在。关于争议:也许我搞错了,但隐式转换似乎是“复杂性”争论的最底层。我注意到隐式创建被分流到SIP18中的非默认功能中。@RichOliver“隐式”和“隐式转换”不是一回事。后者在前者的基础上实现,但并不是其要点。隐式的概念——相对于隐式转换,它是Scala所独有的——确实是一些批评的目标。即使在那时,我也不会把它放在复杂性辩论的“底部”。啊,这是我遗漏的重要信息。