默认值和linq

本文关键字:linq 默认值 | 更新日期: 2023-09-27 18:01:53

为什么这个简单的代码不起作用?

var abc = new[]{1,2,3,4}.Select(x => default(typeof(x)));

我期望像零数组的东西,但得到编译器错误。那么我如何可以默认值在lambda表达式?

在我的实际应用中,我有一个类型为type

的元类
public class FieldInfo
{
     public Type type
}

我将IEnumerable<FieldInfo>作为我的方法的参数,并希望返回每种类型(object[])的默认值数组

默认值和linq

这就是问题所在:

typeof(x)

你正在使用typeof操作符,就好像它是一个方法调用,接受一个值。它不是。它需要一个编译时类型名称或类型参数(或未绑定类型,如Dictionary<,>void)。

default操作符也是如此。

所以这就是错误的地方 -但是在不知道你想要达到什么目的的情况下,我们实际上无法建议你如何解决它。您可能只需要这样的内容:

public static IEnumerable<T> SelectDefault<T>(this IEnumerable<T> source)
{
    return source.Select(x => default(T));
}
然后

:

var abc = new[]{1,2,3,4}.SelectDefault().ToArray();

…会给你一个所有值为0的int[]

编辑:现在我们有了更多的信息,它更容易提供你想要的,这基本上是一个方法,从Type获得默认值,装箱适当:
public static object GetDefaultValue(Type type)
{
    // Non-nullable value types should be boxed, basically
    if (type.IsValueType && Nullable.GetUnderlyingType(type) == null)
    {
        // Not the swiftest approach in the world, but it works...
        return Activator.CreateInstance(type);
    }
    // Everything else defaults to null
    return null;
}

所以你会有这样的东西:

var defaults = fields.Select(field => GetDefaultValue(field.type));

(其中fieldFieldInfo,根据问题-我故意在这里调用GetType())

你是这个意思吗?

var abc = new[]
{
    1, 2, 3, 4
}
.Select(x = > {
    var xType = x.GetType();
    if (xType.IsValueType)
    {
        return Activator.CreateInstance(xType);
    }
    else
    {
        return null;
    }
})

你不能在运行时得到默认值,default()typeof()是编译时的特性。但你可以试试这个建议。它使用Activator.CreateInstance在运行时获取值类型的默认值。

编译器需要一个编译时类型:

var abc = new[]{1,2,3,4}.Select(x => default(Int32));

将生成所有的0。我不知道你想用这个来实现什么,因为所有这些都是返回一个默认值的空数组。