有一个众所周知的事实:C++ templates are turing-complete,CSS is turing-complete(!)和C# overload resolution is NP-hard(即使没有泛型)。
但是C#4.0(具有co / contravariance,泛型等)编译时图灵完成?
答案 0 :(得分:2)
与C ++中的模板不同,C#(和其他.net lang)中的泛型是运行时生成的功能。编译器确实进行了一些检查,以验证类型的使用,但实际的替换发生在运行时。如果我没有弄错以及preprocessor directives ,那么Co和逆变也是如此。很多CLR魔术。
(在实施层面,主要区别在于C# 泛型类型替换在运行时和泛型类型中执行 从而为实例化的对象保留信息)
请参阅MSDN
http://msdn.microsoft.com/en-us/library/c6cyy67b(v=vs.110).aspx
<强>更新强> CLR通过存储在与编译的程序集(Vis-à-vis Jit Compliation)相关联的元数据中的信息来执行类型检查,它将其作为众多服务之一(ShuggyCoUk answer on this question explains it in detail)(其他服务包括内存管理和异常处理) )。因此,我推断编译器将状态理解为进展和状态,如机器内部状态(TC,部分意味着能够通过参考以前的数据(符号)来查看数据(符号) ),有条件地评价)(我犹豫地说明了TC的确切def,因为我,我不确定我是否完全掌握了它,所以请随意填写空白并在适用的时候纠正我)所以用那个我会有点惶恐地说,是的,是的,它可以。