Puis-je initialiser var avec null ou une valeur vide?
C # est un langage strictement/fortement typé. var a été introduit pour la liaison de type à la compilation pour types anonymes mais vous pouvez utiliser var pour les types primitifs et personnalisés déjà connus au moment de la conception. Au moment de l'exécution, rien ne ressemble à var, il est remplacé par un type réel qui est un type de référence ou un type de valeur.
Quand tu dis,
var x = null;
le compilateur ne peut pas résoudre ce problème car il n'y a pas de type lié à null. Vous pouvez le faire comme ça.
string y = null;
var x = y;
Cela fonctionnera car x peut maintenant connaître son type au moment de la compilation, c'est-à-dire chaîne dans ce cas.
Comme d’autres l’ont dit, le type d’ambiguïté est le problème. Donc, la réponse est non, C # ne laisse pas cela arriver parce que c'est un langage fortement typé, et il ne traite que des types connus à la compilation. Le compilateur aurait pu être conçu pour l'inférer comme étant de type object
, mais les concepteurs ont choisi d'éviter la complexité supplémentaire (en C # null
n'a pas de type).
Une alternative est
var foo = new { }; //anonymous type
Notez à nouveau que vous initialisez à un type connu au moment de la compilation et qu’il n’est pas un objet null
, mais anonyme. Ce sont seulement quelques lignes plus courtes que new object()
. Vous ne pouvez réaffecter le type anonyme à foo
que dans ce cas, ce qui peut être souhaitable ou non .
Initialiser à null
avec un type inconnu est hors de question.
Sauf si vous utilisez dynamic
.
dynamic foo = null;
//or
var foo = (dynamic)null; //overkill
Bien sûr, il est plutôt inutile, sauf si vous souhaitez réaffecter des valeurs à la variable foo
. Vous perdez également le support intellisense dans Visual Studio.
Enfin, comme d’autres l’ont répondu, vous pouvez faire déclarer un type spécifique par casting;
var foo = (T)null;
Donc, vos options sont:
//initializes to non-null; I like it; cant be reassigned a value of any type
var foo = new { };
//initializes to non-null; can be reassigned a value of any type
var foo = new object();
//initializes to null; dangerous and finds least use; can be reassigned a value of any type
dynamic foo = null;
var foo = (dynamic)null;
//initializes to null; more conventional; can be reassigned a value of any type
object foo = null;
//initializes to null; cannot be reassigned a value of any type
var foo = (T)null;
Pourquoi cela ne serait-il pas possible?
var theNameOfTheVar = (TheType)null;
par exemple:
var name = (string)null;
Aussi simple que cela.
Voici comment intialize value to var variable
var _myVal = (dynamic)null;
Une var
ne peut pas être définie sur null
car elle doit être typée de manière statique.
var foo = null;
// compiler goes: "Huh, what's that type of foo?"
Cependant, vous pouvez utiliser cette construction pour contourner le problème:
var foo = (string)null;
// compiler goes: "Ah, it's a string. Nice."
Je ne sais pas avec certitude, mais d'après ce que j'ai entendu, vous pouvez également utiliser dynamic
au lieu de var
. Cela ne nécessite pas de typage statique.
dynamic foo = null;
foo = "hi";
De plus, comme la question ne me permettait pas de savoir si vous vouliez parler de var
keyword ou des variables en général: seules les références (aux classes) et les types nullables peuvent être définis sur null. Par exemple, vous pouvez faire ceci:
string s = null; // reference
SomeClass c = null; // reference
int? i = null; // nullable
Mais vous ne pouvez pas faire ceci:
int i = null; // integers cannot contain null
Eh bien, je pense que vous pouvez l'assigner à un nouvel objet. Quelque chose comme:
var v = new object();
Nan. var
doit être initialisé sur un type, il ne peut pas être null.
var
indique simplement au compilateur de déduire le type que vous vouliez au moment de la compilation ... il ne peut pas déduire de null
(bien qu'il y ait des cas où il pourrait ).
Donc, non, vous n'êtes pas autorisé à faire cela.
Quand vous dites "une valeur vide" ... si vous voulez dire:
var s = string.Empty;
//
var s = "";
Alors oui, vous pouvez le faire, mais pas null
.
vous ne pouvez pas affecter null à un type var.
Si vous affectez la valeur null, le compilateur ne trouvera pas la variable que vous vouliez à la place.
émet une erreur: Cannot assign <null> to an implicitly-typed local variable
vous pouvez essayer ceci:
var dummy =(string)null;
Ici, le compilateur peut trouver le type que vous voulez, donc pas de problème
Vous pouvez affecter des valeurs vides.
var dummy = string.Empty;
ou
var dummy = 0;
vous ne pouvez pas initialiser var avec null, var doit être initialisé en tant que type sinon il ne peut pas être déduit, si vous pensez avoir besoin de le faire, vous pouvez peut-être poster le code, il est probable qu'il existe un autre moyen de faire ce que vous êtes essayer.
Merci Mr.Snake, J'ai trouvé cela utile pour un autre tour que je cherchais :) (Pas assez de rep pour commenter)
Affectation abrégée des types nullables . Comme ceci:
var someDate = !Convert.IsDBNull(dataRow["SomeDate"])
? Convert.ToDateTime(dataRow["SomeDate"])
: (DateTime?) null;