C#测试是否分配了变量

C#测试是否分配了变量,c#,.net,linq,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) {

我正在尝试编写一个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;
    }
}
公共静态类扩展
{
public static T MinBy(此IEnumerable源,Func选择器)
{
T分钟;
int?minKey=null;
foreach(源中的变量x)
{
var键=选择器(x);
if(minKey==null | | key
我认为我的逻辑是正确和可读的。但是我得到了一个构建错误

未分配局部变量“min”的使用

我能做些什么?我可以测试变量是否已赋值吗


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

> new List<int>{-5,-2,3}.MinBy(x => x*x)
-2
>新列表{-5,-2,3}.MinBy(x=>x*x)
-2
.NET的最小值函数回答了一个不同的问题(最小的平方)

>新列表{-5,-2,3}.Min(x=>x*x)
4.

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

T最小值=默认值(T)

给定参数化类型t的变量t,语句t=null 仅当T是引用类型且T=0仅适用于 数值类型,但不适用于结构。解决方法是使用 默认关键字,它将为引用类型返回null,为零 对于数值类型。对于结构,它将返回 结构初始化为零或null,具体取决于它们是否为零 值或引用类型。对于可为null的值类型,默认值返回 System.Nullable,与任何结构一样初始化


这是因为在条件中指定了min。编译器无法确定它是否将获得一个值,您应该使用该值初始化min

min
添加默认值:

T min = default(T);

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

FYI这就是我最终得到的结果

    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;
    }
public static T MinBy(此IEnumerable源代码,Func选择器)
{
T min=默认值(T);
bool start=false;
int minKey=默认值(int);
foreach(源中的变量x)
{
var键=选择器(x);
如果(!started | | key
,您无法测试是否分配了变量,您总是会遇到编译错误。

IQueryable在这方面比IEnumerable imho更好。请在MSDN上查看它,它是一种允许查询链接的集合类型,非常强大。您不能使用现有的IEnumerable.Min扩展方法吗?-这也允许你通过一个func:好问题,托比。我在原始问题中对我想要的行为进行了澄清。谢谢。这是否违背了我的逻辑?想了想,没有。
    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;
    }