c#“as”vs“()”转换

时间:2012-11-30 16:50:24

标签: c# ms-office

为什么兼容引用类型之间的转换将在本例中编译(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?

最佳,

编辑:感谢以下两位回答者,以下说明听起来合情合理:

  

不包含.Net版本> = 4.0项目的项目参考中的Microsoft.CSharp,支持   动态语言运行时(DLR)和C#之间的操作不是   可能的,即不可能进行动态演员。

4 个答案:

答案 0 :(得分:4)

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

(T)x比x更简单快捷的操作。 对于性能结果,请看: http://www.codeproject.com/Articles/8052/Type-casting-impact-over-execution-performance-in#_rating

其他一些信息:

强制转换显式地将转换运算符从一种类型调用到另一种类型。如果没有定义这样的转换运算符,则转换将失败。您可以编写自定义转换运算符以在用户定义的类型之间进行转换有关定义转换运算符的更多信息,请参阅explicit(C#Reference)和隐式(C#Reference)。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

() - 如果演员在运行时失败,将抛出异常

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

由于施法比显式施法更快。 希望这会有所帮助!!

答案 3 :(得分:0)

有明确的案例,其中 cast as是有序的,但有时它们看起来好像是可以互换的。在这两种情况下,当两者都可以使用时,我会停下来考虑可读性:

  

默认情况下,尽可能使用类型转换。如果您希望通过面向对象的推理明确表示您正在转换引用,利用继承或接口,则保留as

相关问题