这个新功能非常方便。
最近我阅读了“Microsoft All-In-One Code Framework”的文档,并提到“Optional Parameters”不符合CLS。
所以我在公共API中使用“Optional Parameters”进行了测试,并启用了FxCop,然后我编译了并且FxCop没有抱怨任何事情。平均而言,当我添加一个具有uint作为返回类型的API时,FxCop确实报告了一个警告。
所以现在我很困惑,“可选参数”是否符合CLS标准?
找出新语言功能是否符合CLS标准的最佳方法是什么?
答案 0 :(得分:25)
可选参数是“排序”符合CLS的。带有可选参数的方法是合法的,可以使用CLSCompliant
属性成功编译,但这些方法的调用者不一定需要考虑默认参数值或可选属性。 (在这种情况下,这些方法的行为方式与标准方法完全相同,要求在调用站点明确声明所有参数。)
使用默认参数的方法 在共同语言下是允许的 规格(CLS);然而,CLS 允许编译器忽略这些值 分配给这些参数的。 为编译器编写的代码 忽略默认参数值 必须明确地提供参数 每个默认参数。维持 你想要的行为 编程语言,方法 应该使用默认参数 替换为方法重载 提供默认参数。
答案 1 :(得分:8)
我将您的问题解释为Optional Arguments。
如果是,那么我认为它们符合CLS标准,您可以使用CLSCompliant属性进行检查:
using System;
[assembly: CLSCompliant(true)]
namespace ConsoleApplication1
{
public class Program
{
public static int Test(int val=42)
{
return val;
}
static void Main(string[] args)
{
System.Console.WriteLine(Test());
}
}
}
编译时没有任何警告。
答案 2 :(得分:0)
查看 CLS specs 从第41页开始:
可以包含vararg约束以指示超过此点的所有参数都是可选的。什么时候 看来,调用约定应该是支持变量参数列表的约定。
但是下面的方框说:
CLS规则15:vararg约束不是CLS的一部分,也是唯一支持的调用约定。 CLS是标准的托管调用约定