为什么重载方法在裁判只有符合CLS不同(Why is overloaded method diffe

2019-07-31 23:01发布

通用语言规范是方法重载相当严格。

方法是允许基于数量和类型的参数来只过载,而在一般的方法的情况下,他们的通用参数的数量。

为什么根据CSC这个代码符合CLS(无CS3006警告)?

using System;

[assembly: CLSCompliant (true)]

public class Test {
    public static void Expect<T>(T arg)
    {
    }

    public static void Expect<T>(ref T arg)
    {
    }

    public static void Main ()
    {
    }
}

Answer 1:

这是符合CLS,因为类型不同。 对于超载的规则要求的标准之一(或更多)同时得到满足,不是所有的人。

ref T (或out T ,这是使用具有相同类型的不同的语义是相同的)被声明一个“参考”发送给T引用(类)或实例(在值类型的情况下)。

有关详细信息,查找该Type.MakeByRefType()方法-它创建表示为原始类型的引用的类型,例如,用于一个T此返回一个T&在C ++表示法)。



Answer 2:

需要明确的是,在一般情况下,重载方法不同之处仅在ref或,或在阵列等级, 符合CLS的,根据MSDN 。

您可以验证编译器通过编写一个简单的非通用版本确实检查这种特定情况:

using System;

[assembly: CLSCompliant (true)]

public class Test {
    public static void Expect(int arg)
    {
    }

    public static void Expect(ref int arg)
    {
    }

    public static void Main ()
    {
    }
}

不过,你好像在编译器边缘的情况下已经打,因为如果你在通用方法重载添加,编译器似乎并不抱怨。

我会说这是无论是在编译器中的错误(如本类似的问题 ),或者确实有仿制药更宽松的规范,因为它们是后者除了规范。

我宁可某种编译器限制的一面,因为这个例子也引起了CS3006:

using System;

[assembly: CLSCompliant(true)]

public class Test<T>
{
    public static void Expect(T arg)
    {
    }

    public static void Expect(ref T arg)
    {
    }

    public static void Main()
    {
    }
}

显然,加入泛型类,而不是方法,提高了编译器的关注...



文章来源: Why is overloaded method differing in ref only CLS compliant