C# - Initialiser une variable sans savoir ce que sa va être
J'ai deux tables dans ma base de données, et sont affichés à l'utilisateur en fonction de leurs "SortOrder". J'ai écrit deux fonctions prennent une ligne (ou une entité) et des swaps de son ordre de tri le plus proche (en haut ou en bas, selon la fonction est exécutée). J'ai besoin de faire ces fonctions de travail pour les deux tables différentes, selon l'endroit où l'événement se produit (plusieurs gridviews avec des fonctionnalités identiques). Voici ce que j'ai à ce jour (encore une fois, il est à peu près la même fonction pour déplacer bas, mais je ne le poste que parce qu'il serait redondant):
protected void moveUp(String ValId, String dbName)
{
int ValueId = Convert.ToInt32(ValId);
DataModel.DataAccess.Entities dc = new DataModel.DataAccess.Entities();
if (dbName.ToLower() == "table1")
{
DataModel.DataAccess.Table1 currentValue = dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId);
}
else if (dbName.ToLower() == "table2")
{
DataModel.DataAccess.Table2 currentValue = dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId);
}
try
{
//make the change and update the database and gridview
}
catch (InvalidOperationException)
{
}
}
Le problème évident est que j'ai besoin de lancer le currentValue variable avant les instructions if, sinon il y a la "possibilité" de ne jamais être déclaré, et par conséquent le reste de la fonction (qui utilise le currentValue variable), ne fonctionne pas.
Ma question est: Comment dois-je initialiser la variable avant les instructions if, si je ne suis pas sûr de ce que sa va être encore? J'ai pensé que cela pourrait fonctionner, mais il dit que j'ai encore besoin de l'initialiser ("implicitement de typage des variables locales doivent être initialisées"):
var currentValue; //this is the line where I get the error message above
if (dbName.ToLower() == "table1")
{
currentValue = (DataModel.DataAccess.Table1)dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId);
}
else if (dbName.ToLower() == "table2")
{
currentValue = (DataModel.DataAccess.Table2)dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId);
}
[MODIFIER] Modifié le titre afin de refléter avec plus de précision à ma question
Vous avez un problème avec le Type de currentValue, pas avec la valeur. Juste restructurer votre code.
OriginalL'auteur Jordan Foreman | 2011-06-28
Vous devez vous connecter pour publier un commentaire.
En C#, tous les types de besoin. Si votre
Table#
types d'étendreDataModel.DataAccess.Table
, utilisez ceci:Sinon, vous aurez besoin de trouver une classe de base commune (objet à l'arrière-grand-grand-père de tous).
Puisque vous n'avez pas initialiser
currentValue
, le compilateur ne peut pas savoir de quel type que vous entendez parvar
. C'est pourquoi vous obtenez une exception.Addendum: peut-être, au lieu de passer dans le nom de la table, vous pouvez utiliser une méthode générique, comme ceci:
OriginalL'auteur agent-j
Au lieu de var, utilisez le type de l'objet bien que je serais probablement réécrire tout ce proc et l'utilisation cohérente (et standard), les conventions de nommage.
donc:
OriginalL'auteur Adam Tuliper - MSFT
Vous pouvez essayer d'écrire une interface de chaque entité utilise et une fonction qui accepte cette interface.
OriginalL'auteur Jay
Ne savez-vous pas le type de la variable, qui est pourquoi vous êtes déclarer implicitement ('var', par opposition à, disons, "int")?
Vous n'avez pas à initialiser types explicites - implicite types de besoin parce qu'ils essaient de trouver leur type par la valeur donnée.
OriginalL'auteur
La solution est d'interfaces. Votre Tableau 1 et le Tableau 2 les classes doivent implémenter une interface (comme ISortableTable ou ce que vous voulez l'appeler) avec une propriété pour CurrentValue. Table1 la propriété CurrentValue mise en œuvre serait de retour le résultat correct pour Table1 et Table2 de la propriété CurrentValue serait de retour le résultat correct pour la Table2. Ensuite, ta fonction de tri peut fonctionner avec n'importe quelle classe qui implémente l'ISortableInterface et de travailler avec l'objet de la propriété CurrentValue.
OriginalL'auteur theoretical