在四处搜索之后,我似乎无法找到 C# 编译器抱怨本地变量dteDest在该行中未分配的原因
if (dteSrc == dteDest) {
如果我更换线路,错误就会消失
DateTime dteSrc, dteDest;
和
DateTime dteSrc, dteDest = DateTime.MinValue;
据我所见,如果 dteDest 未由作为输出参数的 DateTime.TryParse 初始化,则代码将永远不会到达比较行。
我的逻辑是:
- 如果 currentDataObj 为 null 则 booHaveOrigDate 为 false 并且第一个if失败
- 如果 currentDataObj 不为 null 但不能转换为 DateTime 则 booHaveOrigDate 为 false 并且第一个if失败
- 如果 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
}
}
}
另外,如果我换行
bool booHaveNewDate = DateTime.TryParse(srcData.ToString(), out dteSrc);
到以下
bool booHaveNewDate = (srcData != null) && DateTime.TryParse(srcData.ToString(), out dteSrc);
然后编译器抱怨 srcDate 也没有分配。
谁能指出我所缺少的正确方向 - 我不是指参数检查等我担心为什么编译器逻辑似乎被使用常见的 TryParse 函数所愚弄?
附加信息
即使扩展逻辑仍然会给出相同的错误(使用未分配的局部变量)
bool booHaveOrigDate;
if (currentDataObj != null)
booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest);
else
booHaveOrigDate = false;
if (booHaveOrigDate) {
if (dteSrc == dteDest) {
似乎编译器对空值检查 (currentDataObj != null) 所做的任何事情都会阻止它正确确定除非分配,否则不会访问 dteDest
将其更改为此代码并且没有问题(除了空对象上可能的 .ToString()
bool booHaveOrigDate = DateTime.TryParse(currentDataObj.ToString(), out dteDest);
if (booHaveOrigDate) {
if (dteSrc == dteDest) {