C# “c”;作为「;vs";()";转换

C# “c”;作为「;vs";()";转换,c#,ms-office,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 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#之间的互操作不可用 可能,即不可能进行动态强制转换


as
实际返回什么?如果它返回的是
null
,那是因为它无法强制转换到
Excel.Worksheet
。施法的效果不同,如果你不能施法,就会出错。这可能就是这里发生的情况。

(T)如果x不能被强制转换为T,那么x将抛出InvalidCastException异常,而在这种情况下,x作为T将返回null。当不存在类型转换问题时,两者是等效的

(T) x是比x作为T更简单、更快的操作。 有关性能结果,请查看:

一些补充资料:

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

资料来源:


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

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

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

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

铸态转换比显式转换快。
希望这有帮助

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

默认情况下,尽可能使用类型转换。当您希望明确表示由于面向对象的推理、利用继承或接口转换引用时,请将
保留为


返回null时,显式强制转换引发了一个异常。@asawyer这仅当它不是正确的类型时才发生。如果你知道它的类型总是正确的,那么它们实际上是相同的。如果你像这样放置它,Excel.Worksheet工作表=((Excel.Worksheet)workbook.Worksheets[1]);然后它会work@Servy当然,这是不言而喻的。@asawyer当你对不知道这两个操作符之间的区别的人说这句话时,也不言而喻。具体来说,强制转换将抛出一个
InvalidCastException
。不,它不会返回“null”。虽然最后一个没有编译,但这是您在问题中遗漏的关键信息。你应该编辑你的问题,添加你收到的实际错误信息。乔恩,我插入了错误信息。关于它,你能说些什么?@HeinrichStack-你的项目是否引用了
Microsoft.CSharp
?因此,Excel.Worksheet没有转换运算符,这就是
(Excel.Worksheet)工作簿.Worksheets[1]的原因
不会编译?实际上,
(Excel.Worksheet)工作簿.Worksheets[1]应该可以工作。一定还有别的事。如果您有可以编译的东西,并且只是修改了这一行,那么它应该仍然可以编译。如果您仍然收到错误,请发布您的代码和您收到的确切错误消息,希望我能够提供帮助。Miltiadis,我插入了错误消息。关于它,你能说些什么?似乎是ASP.NET 3.5的问题。更新了答案。希望有帮助。如果是,请接受答案,我将提供更多关于我认为出错的信息。
targetframework
.netframework4.5
。我将其设置为
4.0
,但仍然出现相同的错误消息。