是C# 4.0的新特性——“可选参数”符合 CLS?

发布于 2024-10-27 09:36:37 字数 289 浏览 8 评论 0原文

这个新功能确实很方便。

最近我读到“Microsoft All-In-One Code Framework”的文档,其中提到“OptionalParameters”不符合CLS。

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

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

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

This new feature is really convenient.

Lately I read the document of the "Microsoft All-In-One Code Framework", and it mentions that "Optional Parameters" is not CLS-Compliant.

So I tested it by using "Optional Parameters" in a public API, and turned on FxCop, then I compiled and FxCop did not complain about anything. At the mean while, FxCop did report a warning when I add an API that has uint as its return type.

So now I am confused, is "Optional Parameters" CLS-Compliant or not?

And what's the best way to find out whether a new language feature is CLS-Compliant or not?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

电影里的梦 2024-11-03 09:36:37

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

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

(摘自“CA1026:不应使用默认参数”的文档。)

Optional arguments are "sort-of" CLS-compliant. Methods with optional arguments are legal and can be successfully compiled with the CLSCompliant attribute, but callers of those methods don't necessarily need to take account of the default parameter values or the optional attribute. (In which case those methods would behave in exactly the same way as standard methods, requiring that all the arguments be stated explicitly at the call site.)

Methods that use default parameters
are allowed under the Common Language
Specification (CLS); however, the CLS
allows compilers to ignore the values
that are assigned to these parameters.
Code that is written for compilers
that ignore default parameter values
must explicitly provide arguments for
each default parameter. To maintain
the behavior that you want across
programming languages, methods that
use default parameters should be
replaced with method overloads that
provide the default parameters.

(Taken from the documentation for "CA1026: Default parameters should not be used".)

失眠症患者 2024-11-03 09:36:37

我将您的问题解释为关于可选参数

如果是这样,那么我相信它们符合 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());
        }
    }
}

编译时不会出现警告。

I interpret your question to be about Optional Arguments.

If so then I believe they are CLS-Compliant and you can check by using the CLSCompliant attribute:

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());
        }
    }
}

This compiles with no warnings.

水水月牙 2024-11-03 09:36:37

请查看 CLS 规范。< br>
从第 41 页开始:

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

但下面的方框说:

CLS 规则 15:可变参数约束不是 CLS 的一部分,也是 CLS 支持的唯一调用约定
CLS 是标准托管调用约定

Have a look at the CLS specs.
From page 41:

The vararg constraint can be included to indicate that all arguments past this point are optional. When
it appears, the calling convention shall be one that supports variable argument lists.

But the box right below says:

CLS Rule 15: The vararg constraint is not part of the CLS, and the only calling convention supported by the
CLS is the standard managed calling convention

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文