Czy mogę zainicjować var z pustą wartością lub pustą wartością?Jak zainicjować var?
Odpowiedz
C# to ściśle/mocno napisany język. var został wprowadzony do wiązania w czasie kompilacji dla anonymous types, ale możesz użyć var dla typów pierwotnych i niestandardowych, które są już znane w czasie projektowania. W środowisku wykonawczym nie ma to jak var, jest zastąpiony przez rzeczywisty typ, który jest albo typem referencyjnym, albo typem wartości.
Kiedy mówisz
var x = null;
kompilator nie może rozwiązać ten problem, bo nie ma typ związany null. Możesz zrobić to w ten sposób.
string y = null;
var x = y;
To będzie działać, ponieważ teraz x może znać jej typ w czasie kompilacji, która jest ciąg w tym przypadku.
Nie można ustawić na null
, ponieważ musi być wpisana statycznie.
var foo = null;
// compiler goes: "Huh, what's that type of foo?"
Jednakże, można użyć tego konstruktu aby obejść problem:
var foo = (string)null;
// compiler goes: "Ah, it's a string. Nice."
Nie wiem na pewno, ale z tego co słyszałem można również użyć dynamic
zamiast var
. Nie wymaga to pisania statycznego.
dynamic foo = null;
foo = "hi";
Ponadto, ponieważ nie było dla mnie jasne od kwestii, czy chodziło o słowa kluczowego var
lub zmienne w ogóle: Tylko referencje (klas) i typy dopuszczające wartość null może być ustawiona na null. Na przykład, można to zrobić:
string s = null; // reference
SomeClass c = null; // reference
int? i = null; // nullable
Ale nie można tego zrobić:
int i = null; // integers cannot contain null
dzięki za wyjaśnienie SomeClass c = null; działa świetnie. – theTechRebel
Nie. var
należy zainicjować na typ, nie może mieć wartości null.
Ding! Var jest trochę jak mówienie do kompilatora: "Nie chcę tego deklarować, ale będziesz wiedział" ... mówiąc var whats = null to jak headfake. – jeriley
var
tylko informuje kompilator, aby ustalić typ chciałeś w czasie kompilacji ... to nie można wywnioskować z null
(choć zdarzają się przypadki, że mógł).
Tak, nie, nie wolno ci tego robić.
Kiedy mówisz „jakiś pusty wartość” ... jeśli masz na myśli:
var s = string.Empty;
//
var s = "";
Następnie tak, można to zrobić, ale nie null
.
nie można przypisać wartości null do typu var.
Jeśli przypiszesz wartość null, kompilator nie może znaleźć żądanej zmiennej w zmiennym miejscu.
wyrzuca błąd: Cannot assign <null> to an implicitly-typed local variable
można spróbować to:
var dummy =(string)null;
Tutaj kompilator może znaleźć żądany typ więc nie ma problemu
można przypisać kilka pustych wartości.
var dummy = string.Empty;
lub
var dummy = 0;
Dlaczego nie byłoby to możliwe?
var theNameOfTheVar = (TheType)null;
np
var name = (string)null;
proste.
To na pewno działa rozwiązanie, ale naprawdę nie mogę wymyślić żadnego powodu, aby go użyć. –
Nie ma. Odpowiadam tylko na pytanie TS :) :) – Snake
jest bardzo użyteczne nie bezpośrednio dla var, ale dla właściwości anonimowego typu, takiego jak var anonType = new {Example = (TheType) null}; –
nie można zainicjować var z null, var musi być zainicjowany jako rodzaj inaczej nie można wywnioskować, jeśli uważasz, że trzeba to zrobić, może można pisać kod jest prawdopodobne, że istnieje inny sposób rób to, co próbujesz.
Myślę, że możesz przypisać go do nowego obiektu. Coś takiego:
var v = new object();
Cóż, jak stwierdzili inni, problemem jest niejasność w typie. Tak więc odpowiedź brzmi nie, C# nie pozwala na to, ponieważ jest to język mocno napisany i zajmuje się tylko znanymi typami kompilacji. Kompilator mógł zostać zaprojektowany tak, aby wywnioskować go jako typ object
, ale projektanci postanowili uniknąć dodatkowej złożoności (w C# null
nie ma typu).
Jedną z alternatyw jest
var foo = new { }; //anonymous type
Znowu pamiętać, że jesteś inicjalizacji do kompilacji znanego typu, a pod koniec jej nie null
, ale anonimowego obiektu. To tylko kilka linii krótszych niż new object()
. Można zmienić przypisanie anonimowego typu tylko na foo
w tym jednym przypadku, co może być pożądane lub nie, ale może być pożądane.
Inicjowanie do null
z nieznanym typem nie wchodzi w grę.
Jeśli nie używasz dynamic
.
dynamic foo = null;
//or
var foo = (dynamic)null; //overkill
Oczywiście jest to całkiem bezużyteczne, chyba że chcesz przypisać wartości do foo
zmiennej. Tracisz obsługę intellisense również w Visual Studio.
Wreszcie, jak inni odpowiedzieli można mieć konkretny typ zadeklarowany przez odlewanie;
var foo = (T)null;
więc opcje są:
//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;
Dobra lista opcji. +1 – ToddBFisher
Dziękuję Mr.Snake, uznał ten pomocny dla innej sztuczki szukałem :) (Nie wystarczająco rep uwag)
skrótowym przypisania typów nullable. Jak to:
var someDate = !Convert.IsDBNull(dataRow["SomeDate"])
? Convert.ToDateTime(dataRow["SomeDate"])
: (DateTime?) null;
To jest droga jak wartość intialize do var zmienna
var _myVal = (dynamic)null;
Czy znaczy, że C# słowa kluczowego 'var' czy też oznaczać zmienne w ogóle? –
Chcę, aby zmienna wykonywała kwerendę linq po inicjacji – maztt
, dlaczego nie zainicjować jej podczas jej używania? – Jimmy