为什么重载方法不同于ref仅符合CLS

Mar*_*far 7 c# cls-compliant

公共语言规范对方法重载非常严格.

允许方法仅基于其参数的数量和类型来重载,并且在通用方法的情况下,允许方法的通用参数的数量.

根据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 ()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ero 2

这是符合 CLS 的,因为类型不同。超载规则要求满足一个(或多个)标准,而不是同时满足所有标准。

A ref T(或out T,使用相同类型的不同语义)正在声明对引用T(对于类)或实例(对于值类型)的“引用”。

有关更多详细信息,请查找该Type.MakeByRefType()方法 - 它创建表示对原始类型的引用的类型,例如,对于 a Tthis 返回 a T&(以 C++ 表示法)。