2016-07-20 22 views
7

Câu hỏi nhanh:Tại sao giá trị của loại null không thể được sử dụng làm tham số mặc định với kiểu double?

MSDN - Named and Optional Arguments (C# Programming Guide) bang rõ ràng rằng

"đối số tùy chọn cho phép bạn bỏ qua đối số cho một số thông số Cả hai kỹ thuật có thể được sử dụng với các phương pháp, chỉ mục, constructors, và các đại biểu. . "

Vì vậy, thay vì điều này:

class MyClass 
{ 

//.. 

public MyClass() { // Empty Constructor's Task } 
public MyClass(SomeType Param1) { // 2nd Constructor's Task } 
public MyClass(SomeType Param1, SomeType Param2) { // 3rd Constructor's Task } 
} 

tôi sẽ có thể làm điều này:

class MyClass 
    { 
     //.. 

     public MyClass(SomeType Param1 = null, SomeType Param2 = null) 
     { 
      if (Param1) 
      { 
       if (Param2) 
       { 
        // 3rd constructor's Task 
       } 
       else 
       { 
        // 2nd constructor's Task 
       } 
      } 
      else 
      { 
       if (!Param2) 
       { 
        // Empty constructor's Task 
       } 
      } 

     } 
    } 

Sau đó, tại sao điều này không hoạt động:

public MyClass(double _x = null, double _y = null, double _z = null, Color _color = null) 
{ 
    // .. 
} 

Nói cho tôi :

Một giá trị của kiểu "vô giá trị" không thể được sử dụng như một tham số mặc định vì không có chuyển đổi tiêu chuẩn để gõ 'đúp'

+0

Nếu có một điều tôi đã học được, đó là downvoter sẽ không bao giờ thấy câu hỏi này bởi vì anh ấy sẽ không quay lại bài viết của bạn: D – Vucko

+0

@Vucko nhưng sau đó người dùng chuyên nghiệp như bạn sẽ đến và xem nó, sẽ biết rằng nó không công bằng bởi vì không có gì sai và điều này ** hữu ích, và upvote nó;) –

+0

Vâng, tôi nghĩ rằng đó là một câu hỏi hay, và upvoted nó: D – Vucko

Trả lời

10

double là một value type. Bạn cần phải bọc nó trong Nullable<T> hoặc ? để viết tắt, để cho biết rằng nó không thể sử dụng được.

public MyClass(double? _x = null, double? _y = null, double? _z = null, Color _color = null) 
{ 
    // .. 
} 
+0

Xin chào David, nhưng sau đó nó nói "_I không thể chuyển đổi' double? 'Thành' double'_ "khi cố gắng gán giá trị của tham số (double?) cho thành viên riêng (double) –

+2

'Nullable ' (như được giải thích trong tài liệu được liên kết trong câu trả lời của tôi) cho thấy '.Value' cho phép bạn lấy kiểu giá trị cơ bản.Hãy nhớ rằng nếu bạn định làm điều này, bạn cũng sẽ muốn kiểm tra '.Nullable .HasValue' và xử lý trường hợp nó là null một cách thích hợp. –

+0

Sử dụng 'if (_x.HasValue) {làm điều gì đó với _x.Value}' –

2

Như David đã giải thích trong câu trả lời của mình, Double không phải là loại không có giá trị. Để gán cho nó một giá trị null, bạn sẽ phải chuyển đổi đúp để System.Nullable<double> hoặc double?

Câu trả lời đầy đủ sẽ giống như thế:

public void MyMethod(double? param = null) { } 

Các vấn đề rõ ràng ở đây là thay vì chỉ đi qua nó giá trị double, thay vào đó, bạn sẽ phải chuyển giá trị double?.

Tôi không chắc chắn về phạm vi chính xác của chức năng này nhưng bạn luôn có thể tham khảo các giá trị mặc định thay thế. Ví dụ:

public void MyMethod(double param = double.MinValue) 
{ 
    if (param == double.MinValue) 
     return; 
} 

Hoặc điều gì đó tương tự.

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