2011-04-04 98 views
1

我有以下代碼:轉換與輸出參數類型

DateTime? toDate = null; 
DateTime.TryParseExact(toDateTextBox.Text, "dd-MM-yyyy", null, 
         System.Globalization.DateTimeStyles.None, out toDate); 

Error: cannot convert from 'out System.DateTime?' to 'out System.DateTime'

我不知道爲什麼它是不可能的轉換通過DateTime?DateTime,儘管它實際上是從DateTime的轉換DateTime?

+0

的可能重複[C#:爲什麼不「裁判」和「出」支持多態性] (http://stackoverflow.com/questions/1207144/c-why-doesnt-ref-and-out-support-polymorphism) – digEmAll 2011-04-04 09:27:42

回答

1

當您使用outref參數時,變量類型必須匹配的參數類型。

主要的原因是爲了確保類型安全,看看下面這個例子有一個想法:

public static void Do(out object value) 
{ 
    value = new Foo(); 
} 


string myStr; 
Do(out myStr); // OMG I'm setting Foo inside a string !! 
+1

我剛剛找到了Eric Lippert的[處理這個爭論的博客文章](http://blogs.msdn.com/b/ericlippert/archive/2009/09/21/why-do-ref-and-out- parameters-not-allow-type-variation.aspx),它也指向一個[這裏真的很好的問題](http://stackoverflow.com/questions/1207144/c-why-doesnt-ref-and-out-support - 多態/ 1207302#1207302),那麼我會建議關閉這個問題作爲重複:) – digEmAll 2011-04-04 09:27:07

+0

Greate!謝謝 :) – Homam 2011-04-04 15:49:52

2

因爲在Nullable<DateTime>DateTime之間不存在隱式轉換。 (DateTime?實際上是Nullable<DateTime>的語法糖)。

可爲空的結構的Value屬性實際上具有valueetype的值。

+0

它是'out'類型。這意味着轉換應該從'DateTime?'轉換爲'DateTime',這在C#中是OK的。 – Homam 2011-04-04 08:55:34

+0

不是DateTime?實例的'.Value'屬性可以轉換爲'DateTime'。 – 2011-04-04 08:58:42

+1

@Jack剛剛嘗試過'DateTime?'到'DateTime',它不是隱含的,只是顯式的。 – 2011-04-04 08:59:30

3

一個輸出參數需要完全相同的數據類型。通過的是對變量的引用,並且該引用正在更新該值。由於DateTime和DateTime?實際上是兩種不同的類型(不管它們之間能否轉換),呼叫失敗。

+0

爲什麼'無論在'out'類型中它們之間轉換的能力'而不是'類型? – Homam 2011-04-04 08:57:16

+0

因爲out參數需要一些地方來存儲DateTime對象。它不能將它存儲在DateTime中?因爲它們不是相同的類型。 C#可能會在封面上做一些神奇的工作,但這可能在優先級列表中很低。 – Talljoe 2011-04-04 09:03:24

0

無法從轉換System.DateTime?System.DateTime 因爲這個out參數不需要可以爲空的datetime類型變量。但是你發送可空的datetime參數給它。