这个新功能真的很方便。
最近我阅读了“Microsoft All-In-One Code Framework”的文档,其中提到“可选参数”不符合 CLS。
所以我在公共 API 中使用“可选参数”对其进行了测试,并打开了 FxCop,然后我编译了 FxCop 并没有抱怨任何事情。同时,当我添加一个以 uint 作为其返回类型的 API 时,FxCop 确实报告了一个警告。
所以现在我很困惑,“可选参数”是否符合 CLS?
确定新语言功能是否符合 CLS 的最佳方法是什么?
这个新功能真的很方便。
最近我阅读了“Microsoft All-In-One Code Framework”的文档,其中提到“可选参数”不符合 CLS。
所以我在公共 API 中使用“可选参数”对其进行了测试,并打开了 FxCop,然后我编译了 FxCop 并没有抱怨任何事情。同时,当我添加一个以 uint 作为其返回类型的 API 时,FxCop 确实报告了一个警告。
所以现在我很困惑,“可选参数”是否符合 CLS?
确定新语言功能是否符合 CLS 的最佳方法是什么?
可选参数是“某种”符合 CLS 的。带有可选参数的方法是合法的,并且可以使用CLSCompliant
属性成功编译,但这些方法的调用者不一定需要考虑默认参数值或可选属性。(在这种情况下,这些方法的行为方式与标准方法完全相同,需要在调用站点明确说明所有参数。)
公共语言规范 (CLS) 允许使用默认参数的方法;但是,CLS 允许编译器忽略分配给这些参数的值。为忽略默认参数值的编译器编写的代码必须为每个默认参数显式提供参数。为了保持跨编程语言所需的行为,使用默认参数的方法应该替换为提供默认参数的方法重载。
(取自“CA1026:不应使用默认参数”的文档。)
我将您的问题解释为关于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());
}
}
}
这编译没有警告。
看看CLS 规格。
从第 41 页开始:
可以包含 vararg 约束以指示超过此点的所有参数都是可选的。当它出现时,调用约定应该是支持可变参数列表的。
但是下面的框说:
CLS 规则 15:可变参数约束不是 CLS 的一部分,CLS 支持的唯一调用约定是标准托管调用约定