C#4.0的新功能 - “可选参数”是否符合CLS?

时间:2011-03-28 09:25:45

标签: c# .net c#-4.0 optional-parameters cls-compliant

这个新功能非常方便。

最近我阅读了“Microsoft All-In-One Code Framework”的文档,并提到“Optional Parameters”不符合CLS。

所以我在公共API中使用“Optional Parameters”进行了测试,并启用了FxCop,然后我编译了并且FxCop没有抱怨任何事情。平均而言,当我添加一个具有uint作为返回类型的API时,FxCop确实报告了一个警告。

所以现在我很困惑,“可选参数”是否符合CLS标准?

找出新语言功能是否符合CLS标准的最佳方法是什么?

3 个答案:

答案 0 :(得分:25)

可选参数是“排序”符合CLS的。带有可选参数的方法是合法的,可以使用CLSCompliant属性成功编译,但这些方法的调用者不一定需要考虑默认参数值或可选属性。 (在这种情况下,这些方法的行为方式与标准方法完全相同,要求在调用站点明确声明所有参数。)

  

使用默认参数的方法   在共同语言下是允许的   规格(CLS);然而,CLS   允许编译器忽略这些值   分配给这些参数的。   为编译器编写的代码   忽略默认参数值   必须明确地提供参数   每个默认参数。维持   你想要的行为   编程语言,方法   应该使用默认参数   替换为方法重载   提供默认参数。

(取自"CA1026: Default parameters should not be used"的文件。)

答案 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是标准的托管调用约定