动态不尊重返回类型

Siu*_*hoi 5 c#

我对C#dynamic关键字很新.在我的一个项目中,我尝试使用它并遇到了一些意想不到的行为.我设法使用以下代码重现这种情况:

class Program
{
    static DateTime? DateOnly(DateTime? time)
    {
        return time.HasValue ? (System.DateTime?)time.Value.Date : null;
    }

    static void Main(string[] args)
    {
        dynamic now = System.DateTime.Now;
        var date = DateOnly(now);
        Console.WriteLine(date.Value); // error thrown here
        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个RuntimeBinderException说法

'System.DateTime'不包含'Value'的定义.

因此变量date被视为DateTime而不是DateTime?.

看起来似乎dynamic忽略了返回类型声明.我应避免使用vardynamic

Tho*_*que 5

因为您将dynamic变量传递给DateOnly方法,所以返回类型也变为动态.所以在这种情况下,你var date的确是dynamic date.它包含一个盒装的可空DateTime,但拳击不保留"可空"部分,所以实际上它只是一个盒装DateTime,没有Value属性.所以你应该做的Console.WriteLine(date)就是打印价值.

正如你所看到的,可空类型并dynamic没有很好地在一起发挥...