我知道可选参数的默认值必须由常量表达式或值类型的无参数构造函数指定。但我不知道为什么!为什么我们不能使用其他东西?任何人都可以为我解释原因吗?
C# 的创建者决定,可选方法参数不应该使类的二进制接口复杂化,这意味着它们应该是仅源代码的语法糖功能,利用语言中预先存在的任何其他机制,而不添加有什么新事吗。
这意味着一方面,给定方法参数的默认值表达式必须在编译每个方法调用时完全可解析。
但是,如果该类已知,此要求仍不应阻止您实例化类以作为默认值传递给参数。因此,实际情况比这要复杂一些。
在像 C# 这样的语言中,当您手中只有 DLL 而没有源代码时,总是可以针对程序集进行编程。因此,“纯源代码”功能从来都不是纯源代码。为了给语言添加可选的方法参数,他们不得不引入一个小技巧:在方法的定义中,编译器为每个可选参数发出一个特定的属性,其内容指定参数的默认值应该是什么是。此属性在运行时不使用,仅在编译时使用。因此,当您编写对该方法的调用并省略可选参数时,编译器会在目标程序集中查找可选参数属性,并知道它应该传递什么值。
但是,C# 中的属性也有这个限制:它们的所有参数都必须是编译时常量。(请参阅ECMA-335 Partition II §21“自定义属性”和 Partition II §23.3“自定义属性”。)
因此,最终,为什么默认参数值必须是编译时常量的问题的答案是因为它们的实现涉及幕后属性的使用,而属性参数又必须是编译时常量。
为什么属性参数必须是编译时常量的技术解释基本上是因为语言的创建者不想让事情变得太复杂。属性参数必须非常简单,以至于可以将它们转换为字节数组并放入二进制文件中,并且在加载类时,这个字节数组必须非常容易地转换为一组参数以传递给属性。就其价值而言,Java 也是如此,其中“属性”被称为“注释”。
| 归档时间: |
|
| 查看次数: |
636 次 |
| 最近记录: |