2009-09-01 2 views
4

J'utilise l'API Visio pour parcourir chaque objet Microsoft.Office.Interop.Visio.Master dans une collection de Microsoft.Office.Interop.Document.Pourquoi le mot-clé C# "var" ne fonctionne-t-il pas lors de la lecture en boucle d'une collection Visio Masters?

Lorsque j'utilise var comme suit, le compilateur ne reconnaît que master que le type object et jette une erreur:

foreach (var master in doc.Masters) 

Au lieu de cela, je dois le faire pour que cela fonctionne:

foreach (Visio.Master master in doc.Masters) 

Pourquoi cela arrive-t-il? Habituellement, je n'ai aucun problème en utilisant var dans une boucle foreach.

Modifier: l'erreur que je reçois quand j'utilise la méthode Open sur master est:

'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

Pourriez-vous poster l'erreur? –

Répondre

16

Je pense que doc.Masters est de retour IEnumerable ou IEnumerable<object> - à-dire qu'elle est faiblement typé.

Fondamentalement, il y a un casting implicite dans la deuxième version - qu'il fait (en supposant que la forme non générique):

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

Il ne sait de quel type vous êtes intéressé parce que vous avez indiqué que la tapez pour la variable. (Ceci est un peu comme spécifiant le type d'une variable de gamme, ce qui rend l'appel du compilateur Cast<T>() dans l'expansion d'une expression de requête LINQ.)

+0

Il est définitivement faiblement typé, car il vient de COM - et toutes les séquences d'origine COM sont des 'IEnumerable's (car il n'y a nulle part où obtenir des annotations de type pour des éléments). –

+2

@Pavel: C'est ce que je devinais, mais ma connaissance COM est aussi faible que les collections qu'elle expose;) –

2

Le mot-clé var ne fonctionne pas à chaque fois que la collection (ou tout ce que vous utilisez-le pour) n'est pas fortement typé. En d'autres termes: Quand il est clair que le côté droit de l'expression renvoie un certain type, la var fonctionne.

Exemple:

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

Cependant, lorsque le type est 'objet', alors var représentera également un objet.

Exemple:

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

Cependant, si la liste est fortement typée, var fonctionnera comme prévu:

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

Je ne sais pas l'API Visio, mais mon hypothèse serait que var se transforme en objet et n'est donc pas très utile pour vous.

Questions connexes