根据int数组上的三元(?)运算符确定var类型

时间:2014-11-24 17:51:14

标签: c# arrays type-conversion ternary-operator

我有一个string []参数来自列表框。根据用户的选择数量,我希望相应地分配var类型。

var intKonsoler = konsoler.Length > 1 ? konsoler.Select(int.Parse).ToArray() : int.Parse(konsoler[0]);
var intGenres = genres.Length > 1 ? genres.Select(int.Parse).ToArray() : int.Parse(genres[0]); 

这显然不会起作用,我得到了:

Type of conditional expression cannot be determined because there is no implicit conversion between 'int[]' and 'int'

那么我想要获得什么?如果string []只包含一个值,我想要将var指定为字符串[]中的int,如果包含多个值,则希望将int []与字符串[]中的值相对应。

3 个答案:

答案 0 :(得分:2)

您应该无条件地拥有一个整数数组,而不是拥有一个整数数组或一个整数的变量。如果您不知道变量是单个值还是值集合,那么您几乎无法使用它。如果您知道它是一个集合,如果它的大小为1,您仍然可以有效地使用它。

让你的第二个选项创建一个内联的单项数组:

var intKonsoler = konsoler.Length > 1 ? 
    konsoler.Select(int.Parse).ToArray() : 
    new[]{int.Parse(konsoler[0])};

或者,更好的是,只需删除条件检查以查看集合的长度是否为1:

var intKonsoler = konsoler.Select(int.Parse).ToArray();

如果它的大小为1,则没有理由以不同的方式处理此集合(在执行此特定操作时)。

答案 1 :(得分:0)

if else有什么问题?

dynamic intKonsoler;

if(konsoler.Length > 1)
{
    intKonsoler = konsoler.Select(int.Parse).ToArray();
}
else
{
    inKonsoler = int.Parse(konsoler[0]);
}

答案 2 :(得分:0)

直接答案:那是不可能的。 好像你误解了var关键字。它与Variant或某些COM方言中的VB无关。对于较长类型的声明(称为 syntactic sugar ),它只是一个方便的快捷方式,其具体类型必须由编译器在编译时确定。

换句话说:你要做的就是写作

int intKonsoler = konsoler.Length > 1 ? konsoler.Select(int.Parse).ToArray() : int.Parse(konsoler[0]);

这是完全错的,我害怕......

修改: 当然,您可以使用dynamic关键字,如其他答案所述。但是你为什么要那样做呢?这将违背C#作为静态类型语言的整个想法。