默认值和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[]
)的默认值数组
这就是问题所在:
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));
(其中field
是FieldInfo
,根据问题-我故意不在这里调用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。我不知道你想用这个来实现什么,因为所有这些都是返回一个默认值的空数组。