我刚刚在 VS2015 .Net v4.5.2 控制台应用程序中输入了以下代码:
dynamic fromString = "blah", toString = "blah2";
DateTime fromDate, toDate;
if (DateTime.TryParse(fromString.ToString(), out fromDate) && DateTime.TryParse(toString.ToString(), out toDate)) {
Console.WriteLine(fromDate);
Console.WriteLine(toDate);
}
Run Code Online (Sandbox Code Playgroud)
出乎意料的是,我收到错误“使用未分配的局部变量 toDate”。我没想到,因为只有在从第二个 TryParse 中为“toDate”分配了一个值时,才会输入 if 语句。
不用说,它可以通过为 'toDate' 分配一个值来解决:
DateTime fromDate, toDate = DateTime.MinValue;
Run Code Online (Sandbox Code Playgroud)
或者将 && 更改为 & 以便无论第一次失败如何都会执行两个 TryParses。
但是,我想知道为什么会发生错误?如果变量 fromString 和 toString 是字符串,则不会发生错误并且编译器不会给出 toDate 未分配的错误。因此我想知道为什么编译器对待string和dynamic.ToString()不同?
在C#4中,当从DynamicObject派生并覆盖TryInvokeMember时,如何确定在调用站点提供的任何参数是否已通过out或ref语义传递?我可以在提供的绑定器中看到包含此信息的一些私有字段(即Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder.ArgumentInfo属性),但它似乎无法访问.我认为这些信息必须在某处可用,否则会严重限制一个人对所提供输入的了解.