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?
Trả lời
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.
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
cảm ơn lời giải thích SomeClass c = null; hoạt động hoàn hảo. – theTechRebel
Nope. var
cần được khởi tạo thành một loại, nó không thể rỗng.
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
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
.
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;
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.
Đâ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ó. –
Không có. Tôi chỉ trả lời câu hỏi của TS :) – Snake
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}; –
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.
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();
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;
Danh sách các tùy chọn tốt. +1 – ToddBFisher
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;
Đây là cách làm thế nào để giá trị intialize để var biến
var _myVal = (dynamic)null;
- 1. Có phải "class var" được khởi tạo bằng không?
- 2. Cách khởi tạo IDictionary trong hàm tạo?
- 3. Sử dụng this.var trong quá trình khởi var của
- 4. Cách tạo công việc khởi tạo mảng nội tuyến như ví dụ: Khởi tạo từ điển?
- 5. Cách khởi tạo cấu trúc?
- 6. Cách tạo trình khởi chạy
- 7. cách khởi tạo mảng char?
- 8. Cách khởi tạo công đoàn?
- 9. Java: cách khởi tạo String []?
- 10. isset ($ var) so với @ $ var
- 11. Sự khác nhau giữa "var = $ {var: -word}" và "var = $ {var: = word}" là gì?
- 12. khởi tạo lớp động
- 13. Cách khởi tạo các phần tử mảng bằng cách sử dụng danh sách bộ khởi tạo?
- 14. cách khởi tạo servlet khi khởi động sever
- 15. var undefined = true;
- 16. Tạo trình khởi tạo
- 17. Khởi tạo tĩnh trong Go?
- 18. Cách khởi tạo một mảng trong Tcl?
- 19. Cách khởi tạo một mảng tĩnh?
- 20. Cách khởi tạo một lớp học?
- 21. Cách khởi tạo vectơ trong C++
- 22. cách khởi tạo QString thành null?
- 23. Android: Cách tạo trình khởi chạy
- 24. khởi tạo mảng char với dấu cách
- 25. Cách khởi tạo và in std :: wstring?
- 26. Khởi tạo một lớp bằng trình khởi tạo siêu lớp
- 27. howto khởi tạo biến covariant?
- 28. Khởi tạo std :: tuple từ danh sách khởi tạo
- 29. khởi tạo mảng char trong một cách tương tự như khởi tạo xâu
- 30. Cách khởi tạo cấu trúc thành viên trong danh sách khởi tạo của lớp C++?
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? –
Tôi muốn biến để thực hiện truy vấn LINQ sau khi bắt đầu – maztt
tại sao không khởi tạo nó khi bạn sử dụng? – Jimmy