【发布时间】:2011-02-10 15:33:48
【问题描述】:
C# 是否具有与 VB.NET 的 DirectCast 等效的功能?
我知道它有 () 强制转换和 'as' 关键字,但它们与 CType 和 TryCast 一致。
明确地说,这些关键字执行以下操作;
CType/() 转换:如果它已经是正确的类型,则转换它,否则寻找类型转换器并调用它。如果没有找到类型转换器,则抛出 InvalidCastException。
TryCast/“as”关键字:如果是正确的类型,则强制转换,否则返回null。
DirectCast:如果是正确的类型,则进行强制转换,否则抛出 InvalidCastException。
在我解释完以上内容后,仍有人回应说 () 是等价的,所以我将进一步解释为什么这是不正确的。
DirectCast 仅允许在继承树上缩小或扩大转换。它不支持像 () 那样跨不同分支的转换,即:
C# - 编译并运行:
//This code uses a type converter to go across an inheritance tree
double d = 10;
int i = (int)d;
VB.NET - 这不会编译
'Direct cast can only go up or down a branch, never across to a different one.
Dim d As Double = 10
Dim i As Integer = DirectCast(d, Integer)
在 VB.NET 中与我的 C# 代码等效的是 CType:
'This compiles and runs
Dim d As Double = 10
Dim i As Integer = CType(d, Integer)
【问题讨论】:
-
+1 用于定义关键字而不是让人们查找它。
-
string s = "10"; int i = (int)s;在 C# 中无法编译。 -
@csauve:你搞错了关键字的作用。虽然
int i = (int)d;可以像示例代码中那样对已知类型执行已知转换,但在您实际 在VB.NET 中使用DirectCast的任何场景中(即,当对象的类型为在编译时未知),在 C# 中使用()进行强制转换不 执行转换——它只是 强制转换。所以一个装箱的双精度不能作为一个整数拆箱。因此,两者实际上是等效的。 -
出于好奇,您为什么需要这个?
-
您关于
()与DirectCast有何不同的陈述对于value 类型是正确的,但对于reference 类型是不正确的。 [这两者对于引用类型是等价的;不执行任何转换。] 这使得比较毫无意义,因为恕我直言,没有理由将DirectCast与 value 类型一起使用。我的看法:()相当于CType值类型,DirectCast引用类型。
标签: c# vb.net casting directcast ctype