2013-07-02 55 views
9

Tôi muốn gán một biến với một giá trị ban đầu của null, và gán giá trị của nó trong if tiếp theo - else khối, nhưng trình biên dịch được đưa ra một lỗi,Initialize giá trị của 'var' trong C# null

Các biến cục bộ được nhập ngầm phải được khởi tạo.

Làm cách nào để đạt được điều này?

+6

http://stackoverflow.com/questions/2904689/how-to-initialize-var – Longball27

Trả lời

26

var biến vẫn có loại - và thông báo lỗi trình biên dịch cho biết loại này phải được thiết lập trong tuyên bố.

Yêu cầu cụ thể (chỉ định giá trị null ban đầu) có thể được thực hiện, nhưng tôi không khuyên bạn nên sử dụng nó. Nó không cung cấp một lợi thế ở đây (tùy theo từng loại vẫn phải được xác định) và nó có thể được xem như là làm cho mã dễ đọc hơn:

var x = (String)null; 

Đó là vẫn còn "loại suy" và tương đương với:

String x = null; 

Trình biên dịch sẽ không chấp nhận var x = null vì nó không liên kết null với bất kỳ loại nào - ngay cả đối tượng. Sử dụng cách tiếp cận trên, var x = (Object)null sẽ "hoạt động" mặc dù nó có tính hữu ích đáng ngờ.

Nói chung, khi tôi không thể sử dụng var 's suy luận kiểu đúng rồi

  1. tôi đang ở một nơi mà nó là tốt nhất để khai báo các biến một cách rõ ràng; hoặc
  2. Tôi nên viết lại mã sao cho giá trị hợp lệ (có loại được thiết lập) được chỉ định trong quá trình khai báo.

Cách tiếp cận thứ hai có thể được thực hiện bằng cách di chuyển mã vào các phương thức hoặc chức năng.

+0

Cám ơn sự chia sẻ, Nó là thông tin hữu ích. –

+0

Cũng giống như các mũi tên lambda và các nhóm phương pháp cũng không có loại của chính chúng. Ví dụ 'var isEven = i => i% 2 == 0;' sẽ không biên dịch. Chúng ta phải trao đổi 'var' với một cái gì đó như' Func ',' Predicate ',' MyDelegate', 'Expression >', v.v. Hoặc, nếu chúng ta nhấn mạnh vào việc sử dụng 'var', chúng ta có thể làm như trên, 'var isEven = (Func ) (i => i% 2 == 0;)'. –

+0

@JeppeStigNielsen Đó là một phần "giới hạn" của đặc điểm kỹ thuật tại thời điểm này (ít nhất là lên đến C# 4): -/Trong ví dụ đầu tiên là các loại không thể giải quyết ngay lập tức mà không có ngữ cảnh bên ngoài (vì tôi không bị ràng buộc), thực sự mong muốn một cái gì đó như 'var x = (int y) => y * 2;' được cho phép. Lưu ý rằng trong trường hợp ví dụ truy cập này, trình biên dịch có thể (và Scala làm) suy ra rằng 'Func x = (int y) => y * 2;' như 'int y' được cho và' int * int -> int' . – user2246674

1

Từ khóa var trong lợi ích chính của C# là tăng cường khả năng đọc, chứ không phải chức năng. Về mặt kỹ thuật, từ khóa var cho phép một số mở khóa khác (ví dụ: sử dụng các đối tượng ẩn danh), nhưng điều đó dường như nằm ngoài phạm vi của câu hỏi này. Mỗi biến được khai báo với từ khóa var có một loại. Ví dụ, bạn sẽ thấy rằng đoạn mã sau xuất ra "String".

var myString = ""; 
Console.Write(myString.GetType().Name); 

Bên cạnh đó, các mã trên tương đương với:

String myString = ""; 
Console.Write(myString.GetType().Name); 

Từ khóa var chỉ đơn giản là C# 's cách khác để nói "Tôi có thể hình dung ra kiểu cho myString từ bối cảnh, vì vậy đừng lo lắng về việc chỉ định loại. "

var myVariable = (MyType)null hoặc MyType myVariable = null sẽ hoạt động vì bạn đang đưa ra ngữ cảnh trình biên dịch C# để tìm ra loại myVariable sẽ là gì.

Để biết thêm thông tin:

+0

nếu tôi phải gán biến này cho nhiều đối tượng lớp tùy thuộc vào điều kiện trong khối if-else , điều này có hiệu quả không, bởi vì chúng tôi đang gán nó cho một số loại 'MyType', có thể thay đổi loại của nó sau này trong mã. –

+1

Chỉ có thể truyền giữa các loại. Vì vậy, bạn có thể làm một cái gì đó như sau: 'MyType myVariable' và' (MyOtherType) myVariable'. Tuy nhiên, bạn có thể muốn suy nghĩ lại mô hình của mình nếu bạn thấy mình đang truyền rất nhiều. Xem xét các tùy chọn với thừa kế hoặc generics. –

Các vấn đề liên quan