Tag: 类型系统

C#是否与Scala的结构类型相当?

在Scala中,我可以定义结构类型如下: type Pressable = { def press(): Unit } 这意味着我可以定义一个函数或方法,它将一个可压缩的参数作为参数,如下所示: def foo(i: Pressable) { // etc. 我传递给这个函数的对象必须为它定义一个名为press()的方法,它匹配类型中定义的类型签名 – 不带参数,返回Unit(Scala的void版本)。 我甚至可以使用结构类型内联: def foo(i: { def press(): Unit }) { // etc. 它基本上允许程序员拥有鸭子打字的所有好处,同时仍然具有编译时类型检查的好处。 C#有类似的东西吗? 我用谷歌搜索但找不到任何东西,但我不熟悉C#的任何深度。 如果没有,有没有计划添加这个?

编译时和运行时转换c#

我想知道为什么在编译时检查C#中的某些转换,而在其他情况下,责任转储到CLR上。 如上所述都是不正确的,但以不同的方式处理。 class Base { } class Derived : Base { } class Other { } static void Main(string[] args) { Derived d = (Derived)new Base(); //Runtime InvalidCastException Derived d = (Derived)new Other(); //Compile-time Cannot convert type… } 在阅读“C#深度”时,我发现了有关此主题的信息,其中autor说: “如果编译器发现该转换实际上不可能工作,它将触发编译错误 – 如果理论上允许但在执行时实际上不正确,则CLR将抛出exception。” “理论上”是否意味着通过inheritance层次结构(对象之间的另一个亲和力?)连接,还是编译器的内部业务?