【问题标题】:Can hand-written CIL do things that C# cannot? [closed]手写 CIL 可以做 C# 做不到的事情吗? [关闭]
【发布时间】:2015-05-20 09:45:06
【问题描述】:

所以这是一个非常简单的问题,但我在任何地方都找不到答案。

如果我以某种方式手动生成 CIL 代码,是否可以执行 C# 中禁止的操作?什么样的事情? (显然,我并不期待一份详尽的清单。)

我还没有深入研究 CIL 的细节。但鉴于 CLR 应该与语言无关,但支持用不同语言编写的组件之间的紧密耦合,我希望 CIL 可以在对象级别工作,并且可能有自己的类型系统。我可以想象该类型系统不如 C# 严格,并且可能还有其他一些可能不同的东西。但我想知道是否有人无需阅读整个语言规范就能明确知道...

【问题讨论】:

  • CLI Specification (ECMA-335) 可用。它相当大(并且需要挖掘),但它确实明确指出了语言之间的一些问题 - 并揭示了“可以”做什么。
  • 简单的答案是肯定的。但可能不是你特别想做的任何事情。如果您查看 Roslyn github repo 上的问题,具体示例会不时出现。
  • 当然,例如 C# 不支持模块构造函数。或者事件的 raise 访问器。或对枚举和委托的约束。或用户定义的值类型。够了吗?
  • 是的。首先,您可以在System.EnumSystem.Delegate 上表达泛型类型约束...
  • 鉴于有些事情可以用 .NET 语言而不是 C# 而不是 C# 来完成,显然可以在 MSIL 而不是 C# 中完成一些事情。只需搜索任何“VB/F#/J#/etc. 和 C# 有何不同”来查找示例。

标签: c# cil


【解决方案1】:

当然。没有什么可以让您完成无法用 C# 编码的任务(图灵完备性等),但是目前 C# 中没有公开的编程结构。请注意,即将发布的 C# 6 添加了其中的一些。

一个肯定不完整的列表,我想不到:

  • try .. fault 块。它们仅在出现异常退出 try 块时执行。
  • 异常过滤器。 VB 已经拥有它们,C# 6 也将拥有它们:catch .. when
  • 结构(值类型)无参数构造函数。 C# 6 将拥有它们。 编辑:svick 评论说该功能已被删除。
  • enum 上的泛型类型约束。
  • protected internal 可见性修饰符(您必须是在同一程序集中的派生类才能访问该字段)。

我相信还有更多。

【讨论】:

猜你喜欢
  • 2014-02-25
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
相关资源
最近更新 更多