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?

一番、

編集:以下の両方の回答者のおかげで、次の説明は合理的に聞こえます:

.Net バージョン >= 4.0 のプロジェクトのプロジェクト リファレンスに Microsoft.CSharp を含めないと、動的言語ランタイム (DLR) と C# の間の相互運用をサポートできません。つまり、動的キャストはできません。

4

4 に答える 4

4

(T)xをTにキャストできない場合、xはInvalidCastException例外をスローしますが、この場合、Tとしてのxはnullを返します。型キャストの問題がない場合、2つは同等です。

(T)xは、Tとしてのxよりも単純で高速な操作です。パフォーマンスの結果については、http: //www.codeproject.com/Articles/8052/Type-casting-impact-over-execution-performance-inを参照してください。 #_rating

いくつかの追加情報:

キャストは、あるタイプから別のタイプへの変換演算子を明示的に呼び出します。そのような変換演算子が定義されていない場合、キャストは失敗します。カスタム変換演算子を記述して、ユーザー定義型間で変換できます。変換演算子の定義の詳細については、明示的(C#リファレンス)および暗黙的(C#リファレンス)を参照してください。

ソース: http: //msdn.microsoft.com/en-us/library/ms173105 (v = vs.80).aspx

更新:提供したエラーメッセージを考えると、アプリケーションがASP.NET3.5をターゲットにしている可能性があります。私の推測では、プロジェクトのプロパティに移動し、ターゲットフレームワークを4.0に設定すると、問題が解決するでしょう。

于 2012-11-30T16:53:55.103 に答える
1

as実際には何が返されますか?を返す場合nullは、 にキャストできないためExcel.Worksheetです。キャストの動作は異なり、キャストできない場合はエラーになります。これはおそらくここで起こっていることです。

于 2012-11-30T16:52:44.440 に答える
0

明確なケースではキャストまたはas順序が決まっていますが、交換可能のように見える場合もあります。そのような場合、両方を使用できる場合は、読みやすさについて少し考えます。

デフォルトでは、可能な限り型キャストを使用します。継承やインターフェースを利用して、オブジェクト指向asの推論のために参照を変換していることを明示的に表現したい場合のために予約してください。

于 2016-07-15T07:57:07.840 に答える