C# 是C“4.0-”的新特性;可选参数“;符合CLS标准?

C# 是C“4.0-”的新特性;可选参数“;符合CLS标准?,c#,.net,c#-4.0,optional-parameters,cls-compliant,C#,.net,C# 4.0,Optional Parameters,Cls Compliant,这个新功能真的很方便 最近,我阅读了“Microsoft All-In-One代码框架”的文档,其中提到“可选参数”不符合CLS 因此,我在公共API中使用“可选参数”对其进行了测试,并打开了FxCop,然后进行了编译,FxCop没有任何抱怨。与此同时,当我添加一个返回类型为uint的API时,FxCop确实报告了一个警告 所以现在我很困惑,“可选参数”是否符合CLS 了解新语言功能是否符合CLS的最佳方法是什么?请查看。 第41页: 可以包括vararg约束,以指示超过此点的所有参数都是可选的

这个新功能真的很方便

最近,我阅读了“Microsoft All-In-One代码框架”的文档,其中提到“可选参数”不符合CLS

因此,我在公共API中使用“可选参数”对其进行了测试,并打开了FxCop,然后进行了编译,FxCop没有任何抱怨。与此同时,当我添加一个返回类型为uint的API时,FxCop确实报告了一个警告

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

了解新语言功能是否符合CLS的最佳方法是什么?

请查看。
第41页:

可以包括vararg约束,以指示超过此点的所有参数都是可选的。什么时候 看来,调用约定应该是支持变量参数列表的约定

但下面的方框写着:

CLS规则15:vararg约束不是CLS的一部分,并且是CLS支持的唯一调用约定 CLS是标准的托管呼叫约定


我把你的问题理解为关于

如果是这样,我相信它们符合CLS,您可以使用以下属性进行检查:

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。带有可选参数的方法是合法的,可以使用
CLSCompliant
属性成功编译,但这些方法的调用方不一定需要考虑默认参数值或可选属性。(在这种情况下,这些方法的行为方式与标准方法完全相同,要求在调用站点显式声明所有参数。)

使用默认参数的方法 在通用语言下是允许的 规范(CLS);然而,CLS 允许编译器忽略这些值 指定给这些参数的。 为编译器编写的代码 忽略默认参数值的 必须显式地为 每个默认参数。维持 你想要表现的行为 编程语言、方法 应使用默认参数 替换为 提供默认参数


(摘自的文档。)

请注意,“varargs”与OP建议的不同。Varargs本质上是关于C#中的“params”关键字,而OPs问题是关于“参数的默认值”(如
void Func(int p=42)
)。@CuiPengFei:“OP”表示“原始海报”——就是你。我相信正确的测试应该是设置并检查它是否会编译。哦,是的。我试过了,但忘了说,对不起。它们在某种程度上符合CLS:它们是允许的,但符合CLS的语言可以忽略默认值和可选属性,只将它们作为普通参数处理。详见我的答案。@LukeH谢谢。也许我们需要能够编写
CLSCompliant(某种程度上)
;-)谢谢,那么我猜他们在文件里说的是错的,对吗?他们是这样说的:“不要用默认参数定义成员,而要使用成员重载。默认参数不符合CLS,在某些语言中不能使用。”这就是文档:只是不认为半官方项目的文档可能是错误的。严格来说,默认参数是不兼容的,但是创建带有默认参数的方法是完全合法的,并且该方法将符合CLS。但这并不意味着其他符合CLS的语言必须遵守您指定的可选属性和默认值。如果您想确保代码的用户(在任何语言中)可以省略参数并返回到您选择的默认值,那么您应该使用重载而不是默认参数。