2011-04-04 69 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参数给它。

相关问题