2015-09-10 45 views
7

Tại sao:String là Nullable trả về false

string s = ""; 
bool sCanBeNull = (s is Nullable); 
s = null; 

sCanBeNull tương đương với sai?

Tôi đang viết trình tạo mã và cần đảm bảo mọi loại được truyền cho nó đều không có giá trị, nếu chưa được.

 //Get the underlying type: 
     var type = field.FieldValueType; 

     //Now make sure type is nullable: 
     if (type.IsValueType) 
     { 
      var nullableType = typeof (Nullable<>).MakeGenericType(type); 
      return nullableType.FullName; 
     } 
     else 
     { 
      return type.FullName; 
     } 

Tôi có cần phải kiểm tra rõ ràng chuỗi hoặc tôi đang thiếu thứ gì đó không?

+0

Liệu (s là Nullable ); return false? –

+3

Không có thứ gì như 'Nullable '. 'Nullable ' là cho các loại giá trị ** có thể vô hiệu **. string là một kiểu tham chiếu. Và 'Nullable' là một lớp tĩnh –

+0

Không phải đoạn mã thứ hai hoạt động? Tôi nghĩ rằng nó nên. Bạn cần phải tính đến thực tế là loại có thể là một loại nullable, mặc dù. – usr

Trả lời

6

is cho bạn biết liệu giá trị có thuộc một loại cụ thể hay không hoặc giá trị được lấy từ loại cụ thể đó.

Nullable là loại chung chung struct cho phép các phiên bản có giá trị không thể vô hiệu hóa.

string không phải là một Nullable

Để nói nếu một loại có thể có null giá trị sử dụng thực tế là cho tất cả các loại như giá trị mặc định là null, trong khi đối với tất cả các loại khác, nó không phải là:

default(string) == null; // true 
+0

Không, 'Nullable' không giống với' Nullable <> '. Cái trước là một '' lớp 'không chung chung', và cái sau là một 'struct' chung. Khi người hỏi đi 'là Nullable', anh ta đang kiểm tra dựa vào một lớp tĩnh, và không cái gì có thể là một thể hiện của một lớp tĩnh, vì vậy điều này là vô nghĩa. Theo trình biên dịch C# 6.0 mới của Roslyn của Visual Studio 2015, nếu được biên dịch với "tính năng nghiêm ngặt", thì lỗi biên dịch _Error \t CS7023 \t Toán hạng thứ hai của toán tử 'is' hoặc 'as' có thể không phải là kiểu tĩnh ' Nullable'_ được phát ra. Mặt khác, sử dụng 'is' với' Nullable <> 'có một cách giải thích đặc biệt. –

+0

Ví dụ về sau: 'object o = 42;/* ... */var b = o là int?; 'được cho phép, và' b' sẽ là 'true'. Lựa chọn này được thực hiện bởi các nhà thiết kế C# vì các quy tắc đấm bốc rất đặc biệt của 'Nullable <>'. –

3

string là loại tham chiếu, vì vậy nó không phải là Nullable vì nó được dành riêng cho các loại giá trị.

Trong thực tế:

var nullable = new Nullable<string>(); 

Cung cấp cho một lỗi thời gian biên dịch.

Loại 'string' phải là một kiểu giá trị không nullable để sử dụng nó như là tham số 'T' trong các loại generic hoặc phương pháp 'System.Nullable'

1

Các hợp lý đằng sau System.Nullable là để có thể đại diện cho các loại giá trị không xác định bằng cách sử dụng từ khóa null. Nó không có nghĩa là bạn có thể kiểm tra xem một số biến có thể được đặt thành null sử dụng someVar is Nullable hay không.

Nếu tại thời gian biên dịch bạn không thể biết trước liệu một số biến sẽ là một giá trị kiểu hoặc một tham chiếu kiểu, bạn có thể sử dụng:

!someVar.GetType().IsValueType 

Nhưng thường là một lập luận chung chung sẽ là một cách tiếp cận tốt hơn.

0

Nullable chỉ là class bình thường như MyClass hoặc System.String (Nullable<T> là cấu trúc).

Vì vậy, nếu bạn gõ:

class _Nullable {} 

struct _Nullable<T> {} 

class Program 
{ 
    static void Main() 
    { 
     string a = ""; 
     Console.Write(a is _Nullable); 
    } 
} 

Bạn sẽ không ngạc nhiên nếu nó trả false phải không?

Nếu bạn muốn kiểm tra xem một cái gì đó là nullable hay không bạn có thể sử dụng if(!(a is ValueType))

 string a = ""; 
     Console.Write("a is nullable = {0}", !(a is ValueType)); 

Output: a is nullable = true

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