下面的代码使用C#来定义一个与CLS兼容的类型,其中一些与CLS不兼容的构造会引起C#编译器报错.
using System;
//告知编译器检查CLS兼容性
[assembly:CLSCompliant(true)]
//因为该类是公有的,有关CLS不兼容的错误将会被显示
public class App {
//错误: App.Abc()的返回值类型与CLS不兼容
public UInt32 Abc() { return 0; }
//错误:仅有大小写差别的标识符App.abc()与CLS不兼容
public void abc() {}
//不会报错,因为该方法是私有的
private UInt32 ABC() {return 0;}
}
在上面的代码中,我们在当前的程序集上应用了一个[assembly:CLSCompliant(true)]特性(attribute).该特性告知编译器必须确保在所有的公有导出类型中,不能有任何阻止其他编程语言访问类型的构造.当上面的代码被编译时,C#编译器将产生两个错误.第一个错误是由于方法Abc返回了一个无符号整数;而Visual Basic 和其他一些语言不能操作无符号整数值.第二个错误是由于该类型提供了两个仅存在名字大小写和返回值类型差别的公有方法:Abc和abc.而visual Basic 和其他一些语言不能调用这两个方法.
有趣的是,如果将class App前面的public 删除并重新编译,前面的两个错误都将消失.这是因为App类型将默认为internal,因此不再用于程序集之外.关于CLS规则的完整列表,可参见.NET框架SDK文档中的"跨语言互操作"部分.
下面是对CLS规则的一个更加简画且易于理解的表述.在CLR中,类型的每个成员或者是一个字段(数据).或者是一个方法(行为).这意味着每一种编程语言都必须能够访问字段和调用方法.这些字段和方法以或者普通或者特殊的应用方法被展现出来.为了简化程序设计,一些编程语言通常都会提供某些额外的抽象使得这些通用的编程模式编写起来更加容易