1

我在这里遗漏了一些东西。我知道人们会在公共接口和方法中使用.NET兼容类型,以便 .NET 语言可以很好地协同工作(例如,“System.String”,而不是 C# 的“string”)。

如果使用 .NET 兼容类型,那么所有基于 .NET 的语言肯定都可以互操作。CLS 合规性何时以及如何影响?

例如,System.UInt16 是 .NET 兼容的,而不是CLR兼容的,并且等效于 C# 中的“ushort”。

4

3 回答 3

1

CLS 合规性比共享类型系统更严格(意味着所有 .NET 语言都可以使用的类型)。

一个示例是命名 - 在 C# 中,您可以使用_.

这不符合 CLS,因为并非所有语言都允许这样做。

于 2013-05-29T18:36:07.727 回答
1

我知道人们会在公共接口和方法中使用 .NET 兼容类型,以便 .NET 语言可以很好地协同工作(例如,“System.String”,而不是 C# 的“string”)。

这实际上不是问题。使用 C#string产生使用System.String.

CLS 合规性何时以及如何影响?

某些语言不支持所有类型,因此如果您想要支持将在所有语言中干净地工作的类型系统,则需要符合 CLS。这意味着ushort( System.UInt16) 不能保证可用于所有 .NET 语言,因此如果您想符合 CLS,则应避免将其暴露在公共类型中。

对于 CLS 合规性,您还需要遵循其他规则,例如不仅按大小写区分成员,因为某些语言不区分大小写。类型要求只是完全符合 CLS 的众多要求之一。

这里的主要问题是,常见的 .NET 语言(例如 C#)允许您使用许多类型、名称和技术,这些类型、名称和技术不能保证适用于所有 CLS 兼容语言 - C# 比语言需要的更灵活符合 CLS 标准。这意味着,当您使用 C# 编写代码时,如果您希望所有符合 CLS 的语言都可以使用该代码,您需要限制在公共 API 中公开的内容。

于 2013-05-29T18:36:38.763 回答
1

如果使用 .NET 兼容类型,那么所有基于 .NET 的语言肯定都可以互操作。

这根本不是真的。并非所有语言都支持所有 .NET 类型。例如,早期版本的 VB.NET 不支持UInt16UInt32UInt64.

CLS 合规性何时以及如何影响?

CLS 定义了语言必须实现的类型以实现互操作。所有其他类型都是可选的。

于 2013-05-29T18:41:09.063 回答