2016-07-20 64 views
7

快速的問題:爲什麼null類型的值不能用作double類型的默認參數?

MSDN - Named and Optional Arguments (C# Programming Guide)明確指出,

可選參數,您可以省略參數的一些參數 這兩種技術都可以與方法,索引使用,構造, 和代表。 「。

因此,不是這樣的:

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 } 
} 

我應該能夠做到這一點:

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 
       } 
      } 

     } 
    } 

那麼,爲什麼這不工作:

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

告訴我:

類型「空」的值,因爲 沒有標準轉換爲類型「雙」

+0

如果有一件事我學到了,那就是downvoter永遠不會看到這個問題,因爲他不會回到你的帖子:D – Vucko

+0

@Vucko但是像你這樣的專業用戶會來看看它,會知道這是不公平的,因爲沒有什麼是錯誤的,這是**有用,並upvote它;) –

+0

是的,我認爲這是一個很酷的問題,並upvoted它:D – Vucko

回答

10

doublevalue type不能用作默認參數。您需要將其包裝在Nullable<T>?中,以表示它可以爲空。

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

嗨大衛,但它然後說:「_I不能轉換'double''嘗試指定參數的值'double'_」( (雙) –

+2

'Nullable '(正如我在答案中鏈接的文檔中所解釋的)公開了'.Value',允許您獲取基礎值類型。請記住,如果您要這樣做,您還需要檢查'.Nullable .HasValue'並處理它適當爲空的情況。 –

+0

使用'if(_x.HasValue){用_x.Value做點什麼}' –

2

正如David在他的回答中解釋的那樣,Double不是可以爲空的類型。爲了給它分配一個空值,你就必須雙轉換爲System.Nullable<double>double?

完整的答案會是這個樣子:

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

這裏的明顯的問題是,而不是僅僅將其傳遞一個double的值,你將不得不傳遞一個double?的值。

我不確定此功能的確切範圍,但您始終可以引用默認值。例如:

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

或類似的東西。

相關問題