C# 错误 CS0165:使用未分配的局部变量 - 忽略逻辑和输出引用

Acc*_* IT 2 c# tryparse unassigned-variable

四处搜索后,我似乎无法找到为什么 C# 编译器抱怨本地变量dteDest 在行中未分配

if (dteSrc == dteDest) {
Run Code Online (Sandbox Code Playgroud)

如果我更换线路,错误就会消失

DateTime dteSrc, dteDest;
Run Code Online (Sandbox Code Playgroud)

DateTime dteSrc, dteDest = DateTime.MinValue;
Run Code Online (Sandbox Code Playgroud)

据我所知,如果 dteDest 没有被 DateTime.TryParse 初始化,它是一个 out 参数,那么代码永远不会到达比较行。

我的逻辑是:

  1. 如果 currentDataObj 为 null,则 booHaveOrigDate 为 false,第一个if失败
  2. 如果 currentDataObj 不为 null 但无法转换为 DateTime,则 booHaveOrigDate 为 false,如果失败则为第一个
  3. 如果 DateTime.TryParse 无法转换为 DateTime,则它将返回 false,这与 && 意味着永远不会使用 dteDest。

简单示例代码

void StrangeLogic(object srcData, object currentDataObj) {
   DateTime dteSrc, dteDest;

   bool booHaveNewDate = DateTime.TryParse(srcData.ToString(), out dteSrc);
   bool booHaveOrigDate = (currentDataObj != null) 
                          && DateTime.TryParse(currentDataObj.ToString(), out dteDest);

   if (booHaveNewDate && booHaveOrigDate) {
      if (dteSrc == dteDest) { 
          // Get a "use of unassignned local variable 'dteDest' 
          // unless dteDest = DateTime.MinValue beforehand
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

另外如果我改变线

bool booHaveNewDate = DateTime.TryParse(srcData.ToString(), out dteSrc);
Run Code Online (Sandbox Code Playgroud)

到以下

bool booHaveNewDate = (srcData != null) && DateTime.TryParse(srcData.ToString(), out dteSrc);
Run Code Online (Sandbox Code Playgroud)

然后编译器抱怨 srcDate 也没有分配。

任何人都可以向我指出我所缺少的正确方向 - 我不是说参数检查等我担心为什么编译器逻辑似乎被使用常见的 TryParse 函数所愚弄?

附加信息

即使扩展逻辑仍然会出现相同的错误(使用未分配的局部变量)

bool booHaveOrigDate;
if (currentDataObj != null) 
   booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest); 
else 
   booHaveOrigDate = false;

if (booHaveOrigDate) {
    if (dteSrc == dteDest) {
Run Code Online (Sandbox Code Playgroud)

似乎编译器对空检查(currentDataObj != null)所做的任何事情都阻止了它正确确定 dteDest 除非已分配,否则不会被访问

将其更改为此代码并且没有问题(除了空对象上可能的 .ToString()

bool booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest); 
if (booHaveOrigDate) {
    if (dteSrc == dteDest) {
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 6

您的替换不正确,应该是:

DateTime dteSrc = DateTime.MinValue, dteDest = DateTime.MinValue;
Run Code Online (Sandbox Code Playgroud)

但是,您应该使用 TryParse 的返回变量,如果您的 booHaveNewDate,它是一个布尔值,用于查看 tryparse 是否起作用:

DateTime dteSrc, dteDest;

if(DateTime.TryParse(srcData.ToString(), out dteSrc) && DateTime.TryParse(currentDataObj.ToString(), out dteDest))
{
  if (dteSrc == dteDest) { 
      // Do your stuff here
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您不必在开始时分配日期。

** 您应该在使用前测试此代码,它不是生产代码并且可能包含错误