禁止“使用未分配的局部变量”错误?

时间:2017-08-10 13:50:40

标签: c#

我有一个像这样的方法:

public static long? FromIpv4ToLong(this string ipAddress)
{
    var octets = ipAddress.Split(IpSplitChar);
    if (octets.Length != 4) return null;

    var success = long.TryParse(octets[0], out long a)
                    && long.TryParse(octets[1], out long b)
                    && long.TryParse(octets[2], out long c)
                    && long.TryParse(octets[3], out long d);

    if (!success) return null;

    return ((16777216L * a) + (65536L * b) + (256L * c) + d);
}

...现在,变量abcd永远不会被引用它们“取消分配”,但是编译器没有这样看。有没有办法可以强制编译器“无论如何”构建它?提前初始化这些值似乎很愚蠢。

3 个答案:

答案 0 :(得分:12)

只需重构代码以避免令人困惑的无意义的局部变量,利用if体内的事实,编译器 知道一切都是明确分配的:< / p>

public static long? FromIpv4ToLong(this string ipAddress)
{
    var octets = ipAddress.Split(IpSplitChar);
    if (octets.Length != 4) return null;

    if (long.TryParse(octets[0], out long a)
        && long.TryParse(octets[1], out long b)
        && long.TryParse(octets[2], out long c)
        && long.TryParse(octets[3], out long d)
    {
        return (16777216L * a) + (65536L * b) + (256L * c) + d;
    } 

    return null;
}

或使用条件运算符(为简单起见使用shift):

public static long? FromIpv4ToLong(this string ipAddress)
{
    var octets = ipAddress.Split(IpSplitChar);
    return octets.Length == 4
        && long.TryParse(octets[0], out long a)
        && long.TryParse(octets[1], out long b)
        && long.TryParse(octets[2], out long c)
        && long.TryParse(octets[3], out long d)
        ? (a << 24) | (b << 16) + (c << 8) | d
        : null;
}

答案 1 :(得分:3)

不,没有办法忽略编译时错误或任何编译时错误。你需要确保编译器能够证明没有读过未初始化的局部变量,你不能只是告诉它“信任你”。

幸运的是,重构代码使得编译器可以证明没有读取过未初始化的变量并不是那么难:

public static long? FromIpv4ToLong(this string ipAddress)
{
    var octets = ipAddress.Split(' ');
    if (octets.Length != 4) return null;

    if (long.TryParse(octets[0], out long a)
                    && long.TryParse(octets[1], out long b)
                    && long.TryParse(octets[2], out long c)
                    && long.TryParse(octets[3], out long d))
    {
        return ((16777216L * a) + (65536L * b) + (256L * c) + d);
    }

    return null;
}

答案 2 :(得分:1)

尝试这样的事情:

public static long? FromIpv4ToLong(this string ipAddress)
{
   var octets = ipAddress.Split(IpSplitChar);
   if (octets.Length != 4) return null;

   if (long.TryParse(octets[0], out long a)
                && long.TryParse(octets[1], out long b)
                && long.TryParse(octets[2], out long c)
                && long.TryParse(octets[3], out long d)){
       return ((16777216L * a) + (65536L * b) + (256L * c) + d);
   }

   return null;
}

编译器不够聪明,无法确定何时成功。