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 参数,那么代码永远不会到达比较行。
我的逻辑是:
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)
您的替换不正确,应该是:
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)
现在您不必在开始时分配日期。
** 您应该在使用前测试此代码,它不是生产代码并且可能包含错误