.NET框架库是否被认为是用户定义的?

时间:2015-03-16 15:21:20

标签: c# .net user-defined

C#文档使用术语"用户定义"相当数量。例如:

  

as运算符无法执行...用户定义的转换...

虽然我没有遇到正式的定义,但我认为C#语言规范中的任何都是用户定义的。

那就是说,我最初认为用户定义意味着任何由语言构建的东西(而不是语言的一部分),但这可能不会有用,因为它可以实现C#编译器C#。

很明显,intdouble不是用户定义的;但是,StringDateTime不太清楚。

什么是框架库的一部分而不是C#的一部分呢? Yuval的回答表明框架库不是用户定义的,而Patricks的答案表明它们是。

3 个答案:

答案 0 :(得分:2)

full sentence you reference是:

  

请注意,as运算符仅执行引用转换,可空转换和装箱转换。 as运算符无法执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行转换。

在这种情况下,用户定义的转换是语言本身无法处理的转换。例如,该语言处理数字类型之间的转换。这些转换是内置于编译器中的,并且有点棘手,因为它们不能反映语言的“正常”行为(现在它们已经构建了它)。

在编译器未涵盖的情况下,您需要自己进行投射。您可以使用转换运算符,如on MSDN中所述。

直接回答标题问题:。 .NET框架库被认为是用户定义的。

答案 1 :(得分:1)

通常,用户定义是指用户(开发人员)定义的任何内容。但是从C#的角度来看,无论在CLR还是C#中实现的都将落入用户定义的。

这意味着即使在.Net框架库中实现,也会被归类为用户定义。

例如,存在从XElementstring的显式转换运算符;它在.Net框架(BCL)中作为显式运算符实现。这仍然是用户定义的融合。

根据以下引用

  

as运算符无法执行...用户定义的转换...

您无法使用as运算符执行用户定义的转换(在本例中为显式转换),但它由BCL提供。

例如,以下代码段无法编译:

string someString = "someString";
XElement element = new XElement("SomeElement", "Value");

someString = (string)element;//Cast just works fine
someString = element as string;//You can't use as keyword here

因此,在此上下文中,用户定义的是C#或CLR未提供的任何内容; .Net框架在这里也不例外。

答案 2 :(得分:0)

  

因为可以在C#中实现C#编译器。

It is definitely possible

  

似乎很清楚int和double不是用户定义的;它更少   但是,使用String和DateTime清除。

用户定义的转化与其外观完全相同,即用户定义的转化。您可以在User-Defined Conversions Tutorial

中清楚地看到它
  

C#允许程序员在类或结构上声明转换   类或结构可以转换为和/或从其他类转换   或结构,或基本类型。转换定义为运算符和   以他们转换的类型命名。

现在为此:

  

那些属于.NET而不属于C#的东西呢?

.NET Framework =基类库+运行时。 BCL提供的所有类型都是框架的一部分。 stringDateTime也是框架的一部分。您可以自己创建用户定义类型的不同类型,这意味着您创建了它们,因为它们已经在BCL中不可用。存在编译器已知的原始类型的内置对话。其他定义的转换将属于用户定义的范围。