2

为什么在这种情况下兼容的引用类型之间的转换会编译(Excel 2010,.Net 4.5)

using Excel = Microsoft.Office.Interop.Excel;
Excel.Application excelApplication = null;
excelApplication = new Excel.Application();

Excel.Worksheet worksheet = workbook.Worksheets[1] as Excel.Worksheet;

在下面的情况下它不会,尽管我看到了这样的例子:

Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];

在这种情况下,我收到以下编译错误:

> CSC : error CS0518: Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not 
defined or imported

> error CS1969: One or more types required to compile a dynamic expression cannot be 
found. Are you missing a reference?

最好的,

编辑:感谢下面的两位回答者,以下解释听起来很合理:

如果不将 Microsoft.CSharp 包含在 .Net 版本 >= 4.0 的项目的项目参考中,则无法支持动态语言运行时 (DLR) 和 C# 之间的互操作,即不可能进行动态转换。

4

4 回答 4

4

(T) 如果 x 不能转换为 T,x 将抛出 InvalidCastException 异常,而在这种情况下 x as T 将返回 null。当没有类型转换问题时,两者是等价的。

(T) x 比 x 作为 T 的操作更简单、更快。有关性能结果,请查看: http: //www.codeproject.com/Articles/8052/Type-casting-impact-over-execution-performance-in #_评分

一些附加信息:

强制转换显式调用从一种类型到另一种类型的转换运算符。如果未定义此类转换运算符,则转换将失败。您可以编写自定义转换运算符来在用户定义的类型之间进行转换。有关定义转换运算符的详细信息,请参阅显式(C# 参考)和隐式(C# 参考)。

来源: http: //msdn.microsoft.com/en-us/library/ms173105 (v=vs.80).aspx

更新:鉴于您提供的错误消息,该应用程序似乎针对 ASP.NET 3.5。我的猜测是转到项目属性并将目标框架设置为 4.0 将解决问题。

于 2012-11-30T16:53:55.103 回答
1

as实际返回的是什么?如果它正在返回null,那是因为它无法转换为Excel.Worksheet. 投射的工作方式不同,如果你不能投射,就会出错。这可能就是这里发生的事情。

于 2012-11-30T16:52:44.440 回答
0

As - 如果强制转换在运行时失败,将返回 null。所以这是安全的。

() - 如果在运行时强制转换失败,将抛出异常

As 只能应用于引用类型或可为空的类型。

因为强制转换比显式强制转换更快。希望这可以帮助!!

于 2016-07-15T07:41:42.890 回答
0

有明确的案例,演员as按顺序排列,但有时它们看起来好像可以互换。在那些情况下,当两者都可以使用时,我会停下来考虑一下可读性:

默认情况下,尽可能使用类型转换。as当您想要明确表示由于面向对象推理、利用继承或接口而转换引用时,请保留这些情况。

于 2016-07-15T07:57:07.840 回答