2009-09-01 3 views
4

私は、Microsoft.Office.Interop.DocumentMastersコレクションの各Microsoft.Office.Interop.Visio.MasterオブジェクトをループするためにVisio APIを使用しています。Visio MastersコレクションをループするときにC#の "var"キーワードが機能しないのはなぜですか?

次のように私はvarを使用すると、コンパイラは唯一のタイプobjectとしてmasterを認識し、エラーがスローされます。

foreach (var master in doc.Masters) 

は代わりに、私はそれを動作させるためにこれをしなければならない。

foreach (Visio.Master master in doc.Masters) 

なぜこうなった?通常、foreachループでvarを使用しても問題はありません。

編集:私はmasterOpenメソッドを使用するときに私が得るエラーは次のとおりです。

'object' does not contain a definition for 'Open' and no extension method 'Open' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

+0

エラーを投稿できますか? –

答えて

16

私の推測では、doc.MastersIEnumerableまたはIEnumerable<object>を返しているということである - すなわち、それは弱い型付けされます。

は、基本的に、第2版では、暗黙的なキャストがあります - それは(非一般的な形式を想定して)やっている:

using (IEnumerator enumerator = doc.Masters.GetEnumerator()) 
{ 
    while (enumerator.MoveNext()) 
    { 
     Visio.Master master = (Visio.Master) enumerator.Current; 
     // Loop body 
    } 
} 

それが唯一のあなたのようにすることを指定したので、あなたが興味を持っているタイプを知っています変数の型を指定します。 (これは、LINQのクエリ式の拡張にコンパイラの呼び出しCast<T>()を行い、範囲変数の型を指定するなどのビットです。)

+0

COMから来ているので、間違いなく弱く型付けされています - そして、COM由来のすべてのシーケンスは普通のIEnumerableです(要素の型名を取得する場所がないため)。 –

+2

@Pavel:これは私が推測していたものですが、COMの知識は公開されているコレクションほど弱いです;) –

2

varキーワードはいつでもコレクション(またはものは何でも動作しません。 for)は強く型付けされていません。言い換えれば、式の右辺が特定の型を返すことが明らかな場合、varは機能します。

例:

var name = "Markus"; // Must be string 
var form = new Form(); // Must be form 

タイプが 'オブジェクト' である場合しかし、その後、VARは、オブジェクトを表すことになります。

例:リストが強く型付けされている場合

var myList = new ArrayList(); // var = ArrayList 
foreach (var item in myList) // item = object 
{ } 

しかし、varは期待どおりに動作します:

var myList = new List<string>(); 
foreach (var item in myList) // item = string 
{ } 

私はVisioのAPIを知らないが、私の仮定はそのVARだろうオブジェクトに変わるので、あまり役に立ちません。

関連する問題