C# 是C“4.0-”的新特性;可选参数“;符合CLS标准?
这个新功能真的很方便 最近,我阅读了“Microsoft All-In-One代码框架”的文档,其中提到“可选参数”不符合CLS 因此,我在公共API中使用“可选参数”对其进行了测试,并打开了FxCop,然后进行了编译,FxCop没有任何抱怨。与此同时,当我添加一个返回类型为uint的API时,FxCop确实报告了一个警告 所以现在我很困惑,“可选参数”是否符合CLS 了解新语言功能是否符合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约束,以指示超过此点的所有参数都是可选的
第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的语言必须遵守您指定的可选属性和默认值。如果您想确保代码的用户(在任何语言中)可以省略参数并返回到您选择的默认值,那么您应该使用重载而不是默认参数。