【发布时间】:2016-05-15 19:48:42
【问题描述】:
我是 C# 新手,我只是遇到了一个问题。在处理三元运算符(? :)时,C# 和 Java 是有区别的。
在下面的代码段中,为什么第 4 行不起作用?编译器显示错误消息there is no implicit conversion between 'int' and 'string'。第 5 行也不行。 Lists 都是对象,不是吗?
int two = 2;
double six = 6.0;
Write(two > six ? two : six); //param: double
Write(two > six ? two : "6"); //param: not object
Write(two > six ? new List<int>() : new List<string>()); //param: not object
但是,相同的代码在 Java 中也可以工作:
int two = 2;
double six = 6.0;
System.out.println(two > six ? two : six); //param: double
System.out.println(two > six ? two : "6"); //param: Object
System.out.println(two > six ? new ArrayList<Integer>()
: new ArrayList<String>()); //param: Object
C# 中缺少哪些语言功能?如果有,为什么不添加?
【问题讨论】:
-
根据msdn.microsoft.com/en-us/library/ty67wk28.aspx“first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。”
-
我有段时间没做C#了,但是你引用的消息不是说的吗?三元的两个分支必须返回相同的数据类型。你给它一个int和一个String。 C# 不知道如何自动将 int 转换为 String。您需要对其进行显式类型转换。
-
@blackr1234 因为
int不是对象。这是一个原始的。 -
@Code-Apprentice 是的,他们是very different indeed - C# 具有运行时具体化,因此列表是不相关的类型。哦,如果你愿意,你也可以将通用接口协变/逆变加入混合,以引入某种程度的关系;)
-
为了 OP 的好处:Java 中的类型擦除意味着
ArrayList<String>和ArrayList<Integer>在字节码中变为ArrayList。这意味着它们在运行时看起来是完全相同的类型。显然在 C# 中它们是不同的类型。
标签: java c# ternary-operator conditional-operator