对象列表中的动态数据类型

时间:2013-05-23 07:30:23

标签: c# asp.net

List<object> list = new List<object>();

long foo = 1;
List<long> bar = new List<long>(){ 1,2,3 }; 

bool someBool = false;

list.Add(new { someProp = someBool ? foo : bar });

为什么someProp数据类型不能动态化?数据类型未指定为对象键,因此我没有看到问题。

  

long和List<long>

之间没有隐式转换

3 个答案:

答案 0 :(得分:3)

错误是由于conditional operator (也称为三元运算符) ?。假设返回单个类型的对象,因为longList<long>不同。你收到了错误。

  

first_expression和second_expression 的类型必须是   相同的或隐式转化必须存在从一种类型到   另一个。

最简单,更易读的替代(IMO)将是:

if (someProp == someBool)
    list.Add(new { someProp = foo });
else
    list.Add(new { someProp = bar });

但上面两个是Anonymous type个不同的对象。

或者你可以摆脱Anonymous对象并简单地将两个添加到列表中,因为它是List<object>之类的:

if (someProp == someBool)
    list.Add(foo);
else
    list.Add(bar);

答案 1 :(得分:2)

?操作要求表达式具有相同的类型。您可以手动(显式)将foo和bar转换为对象类型为相同类型,如下所示:

 list.Add(new { someProp = someBool ? (object)foo : bar });

答案 2 :(得分:0)

来自?: Operator

  

first_expressionsecond_expression 的类型必须是。{   相同,或隐式转换必须存在于一种类型

正如错误所述,longList<long>之间没有隐式转换。 long是整数类型,List<long>是泛型类型。

作为替代方案,您可以使用与object的明确对话,例如:

(object)foo : (object)bar