2010-01-19 32 views
9

Làm cách nào tôi có thể nhận 0 là giá trị nguyên từ (int)null.Tôi muốn "(int) null" trả lại cho tôi 0

EDIT 1: Tôi muốn tạo hàm sẽ trả lại giá trị mặc định cho biểu diễn rỗng trong kiểu dữ liệu tương ứng của chúng.

EDIT 2: Làm thế nào tôi có thể làm việc trong kịch bản này cho việc sử dụng mặc định.

(int) Giá trị

đâu Giá trị có thể được null hoặc bất kỳ số nguyên giá trị. Tôi không biết datatype của giá trị tại thời gian chạy. Nhưng tôi sẽ đảm bảo rằng Giá trị phải chứa giá trị null hoặc Integer.

Trả lời

21

Bạn có thể sử dụng cấu trúc Nullable

int value = new Nullable<int>().GetValueOrDefault(); 

Bạn cũng có thể sử dụng default từ khóa

int value = default(int); 

Sau 2 chỉnh sửa:

Bạn cần một hàm nhận được bất kỳ loại tham số, vì vậy đối tượng sẽ được sử dụng.Chức năng của bạn cũng tương tự như phương pháp Field<T> mở rộng trên một DataRow

public static T GetValue<T>(object value) 
{ 
    if (value == null || value == DBNull.Value) 
     return default(T); 
    else 
     return (T)value; 
} 

Sử dụng chức năng đó, nếu bạn muốn một int (và bạn mong đợi giá trị là một int) bạn gọi nó thích:

int result = GetValue<int>(dataRow["Somefield"]); 
+0

Tôi đồng ý. Không cần phải tái tạo lại bánh xe - sử dụng tính năng ngôn ngữ xây dựng nó - các loại có thể vô hiệu hóa. –

+0

@ Pierre-Alain Vigeant: Cần giải thích thêm về "new Nullable () .GetValueOrDefault();" về những gì và cách nó hoạt động. Tôi bị nhầm lẫn một chút khi sử dụng không biết về loại mã cú pháp này –

+4

@ShantanuGupta Kiểu vô giá trị như 'int?' Cung cấp một phương thức có tên GetValueOrDefault(). Phương thức này trả về giá trị nếu nó không phải là null hoặc giá trị mặc định của loại (0 cho một int) nếu giá trị là null. –

0

Bạn không thể đúc null vào int, vì int là một loại giá trị. Tuy nhiên, bạn có thể truyền nó thành một số int?.

Bạn muốn đạt được điều gì?

+0

@thecoop: Tôi đang cố gắng tạo một hàm tổng quát để trả lại cho tôi một giá trị mặc định cho tất cả các kiểu dữ liệu. –

34

bạn có thể sử dụng từ khóa default để lấy giá trị mặc định của bất kỳ kiểu dữ liệu:

int x = default(int);  // == 0 
string y = default(string); // == null 
// etc. 

này hoạt động với các thông số chung cũng như:

Bar<T> Foo<T>() { 
    return new Bar<T>(default(T)); 
} 

Trong trường hợp bạn có một biến kiểu object có thể chứa null hoặc một giá trị kiểu int, bạn có thể sử dụng nullable types?? operator để chuyển đổi nó một cách an toàn để một số nguyên:

int a = 42; 
object z = a; 
int b = (int?)z ?? 0;  // == 42 
int c = (int?)null ?? 0;  // == 0 
+3

+1: và bạn không cần phải biến nó thành chức năng riêng của nó. –

+1

+1 cho ?? nhà điều hành. –

+0

+1, không biết về từ khóa mặc định. – iandisme

1

Một phương pháp chung trả về phiên bản truyền của đối tượng hoặc giá trị mặc định có thể được triển khai như sau:

static T Cast<T>(object value) { 
    if (value is T) 
     return (T)value; 
    else 
     return default(T); 
} 

Bằng cách này, sử dụng một giá trị hợp lệ sẽ mang lại giá trị bản thân:

int value = Cast<int>(4); //value = 4 

và một giá trị null sẽ nhận được mặc định:

int value = Cast<int>(null); //value = 0 

Chú ý rằng kể từ khi phương pháp này có đối tượng như một cuộc tranh cãi , điều này sẽ gây ra boxing khi được sử dụng với các đối tượng struct (như int).

0

Một phương pháp của một lớp chung mà trả về không có gì hoạt động:

Class GetNull(Of T) 
     Public Shared Function Value() As T 
      Return Nothing 
     End Function 
End Class 



Debug.Print(GetNull(Of Integer).Value()) 
0

Bạn sẽ cần một kiểu trả về của Nullable(Of Integer).

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