C#文档使用术语"用户定义"相当数量。例如:
as运算符无法执行...用户定义的转换...
虽然我没有遇到正式的定义,但我认为C#语言规范中的任何不都是用户定义的。
那就是说,我最初认为用户定义意味着任何由语言构建的东西(而不是语言的一部分),但这可能不会有用,因为它可以实现C#编译器C#。
很明显,int
和double
不是用户定义的;但是,String
和DateTime
不太清楚。
什么是框架库的一部分而不是C#的一部分呢? Yuval的回答表明框架库不是用户定义的,而Patricks的答案表明它们是。
答案 0 :(得分:2)
请注意,as运算符仅执行引用转换,可空转换和装箱转换。 as运算符无法执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行转换。
在这种情况下,用户定义的转换是语言本身无法处理的转换。例如,该语言处理数字类型之间的转换。这些转换是内置于编译器中的,并且有点棘手,因为它们不能反映语言的“正常”行为(现在它们已经构建了它)。
在编译器未涵盖的情况下,您需要自己进行投射。您可以使用转换运算符,如on MSDN中所述。
直接回答标题问题:是。 .NET框架库被认为是用户定义的。
答案 1 :(得分:1)
通常,用户定义是指用户(开发人员)定义的任何内容。但是从C#的角度来看,无论在CLR还是C#中实现的都将落入用户定义的。
这意味着即使在.Net框架库中实现,也会被归类为用户定义。
例如,存在从XElement
到string
的显式转换运算符;它在.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#编译器。
似乎很清楚int和double不是用户定义的;它更少 但是,使用String和DateTime清除。
用户定义的转化与其外观完全相同,即用户定义的转化。您可以在User-Defined Conversions Tutorial:
中清楚地看到它C#允许程序员在类或结构上声明转换 类或结构可以转换为和/或从其他类转换 或结构,或基本类型。转换定义为运算符和 以他们转换的类型命名。
现在为此:
那些属于.NET而不属于C#的东西呢?
.NET Framework =基类库+运行时。 BCL提供的所有类型都是框架的一部分。 string
和DateTime
也是框架的一部分。您可以自己创建用户定义类型的不同类型,这意味着您创建了它们,因为它们已经在BCL中不可用。存在编译器已知的原始类型的内置对话。其他定义的转换将属于用户定义的范围。