2010-05-25 25 views
38

Tôi có thể khởi tạo var bằng null hoặc một số giá trị rỗng không?Cách khởi tạo var?

+2

Bạn có nghĩa là các từ khóa # C 'var' hoặc làm bạn có nghĩa là các biến nói chung? –

+0

Tôi muốn biến để thực hiện truy vấn LINQ sau khi bắt đầu – maztt

+0

tại sao không khởi tạo nó khi bạn sử dụng? – Jimmy

Trả lời

36

C# là ngôn ngữ được nhập chính xác/mạnh mẽ. var đã được giới thiệu để biên dịch kiểu-ràng buộc thời gian cho anonymous types nhưng bạn có thể sử dụng var cho các kiểu nguyên thủy và tùy chỉnh đã được biết đến tại thời điểm thiết kế. Tại thời gian chạy không có gì giống như var, nó được thay thế bằng một loại thực tế là kiểu tham chiếu hoặc kiểu giá trị.

Khi bạn nói,

var x = null; 

trình biên dịch không thể giải quyết này vì không có loại ràng buộc để null. Bạn có thể làm cho nó như thế này.

string y = null; 
var x = y; 

Điều này sẽ hoạt động vì bây giờ x có thể biết loại của nó tại thời gian biên dịch là chuỗi trong trường hợp này.

3

Không thể đặt var thành null vì nó cần được nhập tĩnh.

var foo = null; 
// compiler goes: "Huh, what's that type of foo?" 

Tuy nhiên, bạn có thể sử dụng cấu trúc này để làm việc xung quanh vấn đề này:

var foo = (string)null; 
// compiler goes: "Ah, it's a string. Nice." 

Tôi không biết chắc, nhưng từ những gì tôi nghe nói bạn cũng có thể sử dụng dynamic thay vì var. Điều này không yêu cầu gõ tĩnh.

dynamic foo = null; 
foo = "hi"; 

Ngoài ra, vì nó không phải là rõ ràng với tôi từ câu hỏi nếu bạn có nghĩa là các var từ khóa hoặc các biến nói chung: Chỉ có tài liệu tham khảo (đến các lớp học) và các loại nullable có thể được thiết lập để null. Ví dụ, bạn có thể làm điều này:

string s = null; // reference 
SomeClass c = null; // reference 
int? i = null; // nullable 

Nhưng bạn không thể làm điều này:

int i = null; // integers cannot contain null 
+0

cảm ơn lời giải thích SomeClass c = null; hoạt động hoàn hảo. – theTechRebel

3

Nope. var cần được khởi tạo thành một loại, nó không thể rỗng.

+1

Ding! Var là loại giống như nói với trình biên dịch "Tôi không cảm thấy như tuyên bố này nhưng bạn sẽ biết" ... nói var bất cứ điều gì = null cũng giống như làm một headfake. – jeriley

3

var chỉ yêu cầu trình biên dịch suy ra loại bạn muốn tại thời gian biên dịch ... không thể suy ra từ null (mặc dù có trường hợp nó có thể).

Vì vậy, không bạn không được phép thực hiện việc này.

Khi bạn nói "một số giá trị rỗng" ... nếu bạn muốn tìm:

var s = string.Empty; 
// 
var s = ""; 

Sau đó có, bạn có thể làm điều đó, nhưng không null.

2

bạn không thể gán giá trị rỗng cho loại biến thể.

Nếu bạn gán null, trình biên dịch không thể tìm thấy biến mà bạn muốn ở vị trí var.

ném lỗi: Cannot assign <null> to an implicitly-typed local variable

bạn có thể thử này:

var dummy =(string)null; 

Dưới đây trình biên dịch có thể tìm thấy các loại mà bạn muốn như vậy không có vấn đề

Bạn có thể gán một số giá trị rỗng.

var dummy = string.Empty; 

hoặc

var dummy = 0; 
27

Tại sao điều này sẽ không thể?

var theNameOfTheVar = (TheType)null; 

ví dụ:

var name = (string)null; 

đơn giản như vậy.

+2

Đây chắc chắn là một giải pháp làm việc, nhưng tôi thực sự không thể đưa ra bất kỳ lý do gì để sử dụng nó. –

+2

Không có. Tôi chỉ trả lời câu hỏi của TS :) – Snake

+0

nó rất hữu ích không trực tiếp cho var nhưng đối với các thuộc tính của một kiểu ẩn danh như var anonType = new {Example = (TheType) null}; –

0

bạn không thể khởi tạo var bằng null, var cần được khởi tạo dưới dạng kiểu nếu không thì không thể suy ra, nếu bạn cho rằng bạn cần làm điều này, bạn có thể đăng mã có khả năng là có cách khác làm những gì bạn đang cố gắng.

3

Vâng, tôi nghĩ bạn có thể gán nó cho một đối tượng mới. Một cái gì đó như:

var v = new object(); 
26

Vâng, như những người khác đã nói, sự mơ hồ trong loại là vấn đề. Vì vậy, câu trả lời là không, C# không cho phép điều đó xảy ra bởi vì nó là một ngôn ngữ gõ mạnh mẽ, và nó chỉ giao dịch với các loại biên dịch đã biết. Trình biên dịch có thể đã được thiết kế để suy ra nó như loại object, nhưng các nhà thiết kế đã chọn để tránh sự phức tạp thêm (trong C# null không có loại).

Một thay thế là

var foo = new { }; //anonymous type 

Một lần nữa lưu ý rằng bạn đang khởi tạo một loại thời gian biên dịch được biết đến, và vào cuối của nó không null, nhưng đối tượng ẩn danh. Nó chỉ có một vài dòng ngắn hơn new object(). Bạn chỉ có thể gán lại loại ẩn danh cho foo trong trường hợp này, có thể hoặc không được mong muốn.

Khởi tạo thành null với loại không được biết là không đúng.

Trừ khi bạn đang sử dụng dynamic.

dynamic foo = null; 
//or 
var foo = (dynamic)null; //overkill 

Tất nhiên nó là vô dụng, trừ khi bạn muốn gán lại giá trị cho biến số foo. Bạn mất hỗ trợ intellisense cũng như trong Visual Studio.

Cuối cùng, như những người khác đã trả lời, bạn có thể có một loại cụ thể được khai báo bằng cách truyền;

var foo = (T)null; 

Vì vậy, lựa chọn của bạn là:

//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

Danh sách các tùy chọn tốt. +1 – ToddBFisher

0

Cảm ơn bạn Mr.Snake, Tìm thấy hữu ích này cho người khác lừa tôi đang tìm kiếm :) (Không đủ đại diện cho bình luận)

phân Shorthand của các loại nullable. Như thế này:

var someDate = !Convert.IsDBNull(dataRow["SomeDate"]) 
        ? Convert.ToDateTime(dataRow["SomeDate"]) 
        : (DateTime?) null; 
6

Đây là cách làm thế nào để giá trị intialize để var biến

var _myVal = (dynamic)null; 
Các vấn đề liên quan