Câu trả lời:
Các câu trả lời khác cho đến nay đều đúng; Tôi chỉ muốn thêm một thứ nữa sạch hơn một chút:
v2 = v1 ?? default(int);
Bất kỳ Nullable<T>
đều được chuyển đổi hoàn toàn thành của nó T
, CUNG CẤP rằng toàn bộ biểu thức được đánh giá không bao giờ có thể dẫn đến việc gán null cho ValueType. Vì vậy, toán tử hợp nhất null ??
chỉ là cú pháp đường cho toán tử ternary:
v2 = v1 == null ? default(int) : v1;
... đến lượt cú pháp đường cho một if / other:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Ngoài ra, kể từ .NET 4.0, Nullable<T>
có phương thức "GetValueOrDefault ()", đây là một công cụ nhận an toàn null, về cơ bản thực hiện quá trình kết hợp null được hiển thị ở trên, do đó, điều này cũng hoạt động:
v2 = v1.GetValueOrDefault();
default(int)
thực sự cần thiết? Có gì sai với một đơn giản 0
?
default
khi thích hợp. Không luôn luôn có giá trị như một giá trị, ít hơn nhiều so với mặc định, vì vậy nếu bạn thay thế int
bằng một chung chung, T
bạn sẽ thấy mã của tôi hoạt động trong khi không. Trong một số phiên bản khung trong tương lai, default
cũng có thể trở nên quá tải; nếu và khi điều đó xảy ra, mã sử dụng mặc định sẽ dễ dàng có thể tận dụng lợi thế, trong khi các phép gán null hoặc zero rõ ràng sẽ phải được thay đổi.
Như thế này,
if(v1.HasValue)
v2=v1.Value
Bạn có thể sử dụng thuộc tính Giá trị để gán.
v2 = v1.Value;
v1.HasValue
đầu tiên.
Nếu bạn biết rằng v1
có một giá trị, bạn có thể sử dụng thuộc Value
tính:
v2 = v1.Value;
Sử dụng GetValueOrDefault
phương thức sẽ gán giá trị nếu có, nếu không thì mặc định cho loại hoặc giá trị mặc định mà bạn chỉ định:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Bạn có thể sử dụng thuộc HasValue
tính để kiểm tra nếu v1
có giá trị:
if (v1.HasValue) {
v2 = v1.Value;
}
Ngoài ra còn có hỗ trợ ngôn ngữ cho GetValueOrDefault(T)
phương pháp:
v2 = v1 ?? -1;
Bạn không thể làm điều đó nếu v1 là null, nhưng bạn có thể kiểm tra với một nhà điều hành.
v2 = v1 ?? 0;
GetValueOrDefault()
lấy giá trị của đối tượng. Nếu nó là null, nó trả về giá trị mặc định của int, là 0.
Thí dụ:
v2= v1.GetValueOrDefault();
Nếu giá trị mặc định cho một loại nhất định là kết quả chấp nhận được:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
Nếu bạn muốn một giá trị mặc định khác khi kết quả không được xác định:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
Nếu bạn chỉ muốn giá trị được trả về (bất kể phương thức có thất bại hay không):
v2 = v1.GetValueOrDefault();
.NET 4.7.2.: Trả GetValueOrDefault()
về giá trị trường mà không cần kiểm tra.
Theo tôi là giải pháp tốt nhất là sử dụng GetValueOrDefault()
phương pháp.
v2 = v1.GetValueOrDefault();
Int nullable để chuyển đổi int có thể được thực hiện như vậy:
v2=(int)v1;
nó có thể với v2 = Convert.ToInt32(v1);
Một chuyển đổi đơn giản giữa v1
và v2
không thể thực hiện được vì v1
có miền giá trị lớn hơn v2
. Đó là tất cả mọi thứ v1
có thể giữ cộng với null
nhà nước. Để chuyển đổi, bạn cần nêu rõ giá trị nào int
sẽ được sử dụng để ánh xạ null
trạng thái. Cách đơn giản nhất để làm điều này là ??
toán tử
v2 = v1 ?? 0; // maps null of v1 to 0
Điều này cũng có thể được thực hiện ở dạng dài
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
Tùy thuộc vào ngữ cảnh sử dụng của bạn, bạn có thể sử dụng tính năng khớp mẫu của C # 7:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Vì một số người đang bỏ phiếu mà không để lại lời giải thích, tôi muốn thêm một số chi tiết để giải thích lý do đưa vào đây là một giải pháp khả thi.
Kết hợp mẫu của C # 7 bây giờ cho phép chúng tôi kiểm tra loại giá trị và bỏ mặc nó. Trong đoạn mã trên, điều kiện if sẽ chỉ vượt qua khi giá trị được lưu trong v1
tương thích với loại cho v2
, trong trường hợp này là int
. Theo sau khi giá trị v1
là null
, điều kiện if sẽ thất bại vì null không thể được gán cho một int
. Đúng hơn, null
không phải là một int
.
Tôi muốn nhấn mạnh rằng giải pháp này có thể không phải luôn luôn là lựa chọn tối ưu. Như tôi đề xuất, tôi tin rằng điều này sẽ phụ thuộc vào bối cảnh sử dụng chính xác của nhà phát triển. Nếu bạn đã có int?
và muốn vận hành có điều kiện theo giá trị của nó nếu và chỉ - nếu giá trị được gán không phải là null (đây là lần duy nhất an toàn để chuyển đổi một giá trị null thành int thông thường mà không mất thông tin), thì khớp mẫu có lẽ là một trong những cách ngắn gọn nhất để làm điều này.
HasValue
séc của bạn .
Trong C # 7.1 trở lên, loại có thể được suy ra bằng cách sử dụng default
chữ thay vì default
toán tử để có thể viết như sau:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
là khinull
nào?