none
请大家讨论一下 C# ??空结合 运算符 RRS feed

  • 问题

  • String name = String.Empty;

    name = name ?? "Writer your name . Please.";

    上面的运用很好。但是出现在值类型,就不行了。

    Int32 val = 0;

    val = val ?? -1;

    不知道C# 为什么对值类型的处理会失败。

    2013年12月17日 12:28

答案

  • 因为值类型没有 null 值。

    你这样写:

    Nullable<Int32> val = 0; 

    或者

    Int32? val =0;

    val = val ?? -1;

    2013年12月18日 1:56
  • 你好,?? 这个运算符可以解释成为语法糖吗 ? 如果是,那么就交给了编译器来做的,所以,为什么编译器可以编译成NULL,遇到整型的时候却无法编译成0,0.0,0.00等呢?特别想知道C#编译器的看法.
    2014年1月6日 0:16
  • 你好,?? 这个运算符可以解释成为语法糖吗 ? 如果是,那么就交给了编译器来做的,所以,为什么编译器可以编译成NULL,遇到整型的时候却无法编译成0,0.0,0.00等呢?特别想知道C#编译器的看法.

    请看一下 ?? 运算符的解释:http://msdn.microsoft.com/zh-cn/library/ms173224(v=vs.120).aspx。?? 称为 null 合并运算符,及空值合并运算符,不是默认值合并运算符。

    请问 Int32 有没有空值?0 是 Int32 的空值,还是默认值? Int32 i = default(Int32) 中的 i 等于多少?

    我想你应该知道 Int32 是没有空值的,并且 0 是 Int32 的默认值(default(Int32)),因此你的问题就问错了,因为我们定义的是 null 合并运算符,编译器为什么要将默认值合并运算的功能添加进去呢?这不就成为编译器的 BUG 了吗?

    因此你的问题实际上该这么问: 为什么运算符 ?? 不实现“默认值合并”运算的功能,也就是说我们可以将其定义为默认值合并运算符?

    我们假设添加了默认值合并运算功能,那么请你推断下面语句中 n 等于多少:

    int? m = 0,n;   // 这里的 n 等于什么?

    n = m ?? -1;   // 这里的 n 等于什么?

    2014年1月6日 2:12

全部回复

  • 因为值类型没有 null 值。

    你这样写:

    Nullable<Int32> val = 0; 

    或者

    Int32? val =0;

    val = val ?? -1;

    2013年12月18日 1:56
  • 你好,?? 这个运算符可以解释成为语法糖吗 ? 如果是,那么就交给了编译器来做的,所以,为什么编译器可以编译成NULL,遇到整型的时候却无法编译成0,0.0,0.00等呢?特别想知道C#编译器的看法.
    2014年1月6日 0:16
  • 你好,?? 这个运算符可以解释成为语法糖吗 ? 如果是,那么就交给了编译器来做的,所以,为什么编译器可以编译成NULL,遇到整型的时候却无法编译成0,0.0,0.00等呢?特别想知道C#编译器的看法.

    请看一下 ?? 运算符的解释:http://msdn.microsoft.com/zh-cn/library/ms173224(v=vs.120).aspx。?? 称为 null 合并运算符,及空值合并运算符,不是默认值合并运算符。

    请问 Int32 有没有空值?0 是 Int32 的空值,还是默认值? Int32 i = default(Int32) 中的 i 等于多少?

    我想你应该知道 Int32 是没有空值的,并且 0 是 Int32 的默认值(default(Int32)),因此你的问题就问错了,因为我们定义的是 null 合并运算符,编译器为什么要将默认值合并运算的功能添加进去呢?这不就成为编译器的 BUG 了吗?

    因此你的问题实际上该这么问: 为什么运算符 ?? 不实现“默认值合并”运算的功能,也就是说我们可以将其定义为默认值合并运算符?

    我们假设添加了默认值合并运算功能,那么请你推断下面语句中 n 等于多少:

    int? m = 0,n;   // 这里的 n 等于什么?

    n = m ?? -1;   // 这里的 n 等于什么?

    2014年1月6日 2:12