C#测试是否分配了变量

时间:2012-07-04 09:30:52

标签: c# .net linq

我正在尝试编写Linq MinBy扩展方法

public static class Extensions
{
    public static T MinBy<T>(this IEnumerable<T> source, Func<T,int> selector)
    {
        T min;
        int? minKey = null;
        foreach (var x in source)
        {
            var key = selector(x);
            if (minKey == null || key < minKey)
            {
                minKey = key;
                min = x;
            }
        }
        if (minKey == null)
        {
            throw new ArgumentException("source should not be empty");
        }
        return min;
    }
}

我认为我的逻辑是正确和可读的。但是我收到了构建错误

  

使用未分配的局部变量'min'

我该怎么办?我可以测试变量是否已分配?


澄清:MinBy函数可以回答以下问题。哪个数字[-5,-2,3]具有最小的平方?

> new List<int>{-5,-2,3}.MinBy(x => x*x)
-2

.NET的Min函数回答了一个不同的问题(这是最小的正方形)

> new List<int>{-5,-2,3}.Min(x => x*x)
4

5 个答案:

答案 0 :(得分:23)

您需要min的默认值,如下所示:

T min = default(T);

You can read more about default() on MSDN:

  

给定参数化类型T的变量t,语句t = null   仅当T是引用类型且t = 0才有效时才有效   数值类型,但不适用于结构。解决方案是使用   default关键字,它将为引用类型返回null并为零   对于数值类型。对于结构,它将返回每个成员   struct初始化为零或null,具体取决于它们是否为   价值或参考类型。对于可为空的值类型,default返回a   System.Nullable,它像任何结构一样被初始化。

答案 1 :(得分:4)

min添加默认值:

T min = default(T);

它抱怨的原因是编译器无法验证minreturn min;行中使用之前是否已赋值。无法引用未分配的局部变量,因此编译器会生成错误。

答案 2 :(得分:1)

这是因为在条件内分配了min。编译器无法确定它是否会获得值,您应该使用default值初始化min。

答案 3 :(得分:-1)

仅供参考,这是我最终的结果

    public static T MinBy<T>(this IEnumerable<T> source, Func<T,int> selector)
    {
        T min = default(T);
        bool started = false;
        int minKey = default(int);
        foreach (var x in source)
        {
            var key = selector(x);
            if (!started || key < minKey)
            {
                minKey = key;
                min = x;
                started = true;
            }
        }
        if (!started)
        {
            throw new ArgumentException("source should not be empty","source");
        }
        return min;
    }

答案 4 :(得分:-1)

,您无法测试是否已分配变量,您将始终收到编译错误。