2010-05-25 9 views
38

Czy mogę zainicjować var ​​z pustą wartością lub pustą wartością?Jak zainicjować var?

+2

Czy znaczy, że C# słowa kluczowego 'var' czy też oznaczać zmienne w ogóle? –

+0

Chcę, aby zmienna wykonywała kwerendę linq po inicjacji – maztt

+0

, dlaczego nie zainicjować jej podczas jej używania? – Jimmy

Odpowiedz

36

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.

3

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 
+0

dzięki za wyjaśnienie SomeClass c = null; działa świetnie. – theTechRebel

3

Nie. var należy zainicjować na typ, nie może mieć wartości null.

+1

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

3

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.

2

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; 
27

Dlaczego nie byłoby to możliwe?

var theNameOfTheVar = (TheType)null; 

np

var name = (string)null; 

proste.

+2

To na pewno działa rozwiązanie, ale naprawdę nie mogę wymyślić żadnego powodu, aby go użyć. –

+2

Nie ma. Odpowiadam tylko na pytanie TS :) :) – Snake

+0

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}; –

0

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.

3

Myślę, że możesz przypisać go do nowego obiektu. Coś takiego:

var v = new object(); 
26

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; 
+0

Dobra lista opcji. +1 – ToddBFisher

0

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; 
6

To jest droga jak wartość intialize do var zmienna

var _myVal = (dynamic)null;