键入使用动态操作数检查null-coalescing运算符

时间:2018-03-20 13:12:20

标签: c# .net type-safety null-coalescing-operator

考虑以下最小例子:

class Program {
    static void Main(string[] args) {
        Dictionary<string, int> obj = GetDynamic() ?? new List<string>();
    }

    private static dynamic GetDynamic() {
        return null;
    }
}

代码将编译,但在运行时失败,因为List<T>无法转换为Dictionary<TKey, TValue>。我想这是因为表达式GetDynamic() ?? new List<string>()在编译时解析为dynamic类型。

当null-coalescing运算符的任何一个操作数与预期的返回类型不匹配时,有没有办法强制编译错误?

1 个答案:

答案 0 :(得分:1)

  

为什么编译器不能在这里说出错误(因为对于开发人员来说这很明显)。

因为编写代码的开发人员明确告诉编译器不要检查。当我们使用dynamic时,我们会有效地告诉编译器关闭静态类型检查。

以这种方式使用dynamic并不是一个好的设计。如果您不知道返回的类型,那么代码设计存在缺陷,当它返回Dictionary<string, int>以外的任何内容时,您仍会遇到运行时错误。将dynamic更改为Dictionary<string, int>,您将获得所需的编译时错误。

这可能会回答你的问题,但它绝不是一件好事。如果你强制转换dynamic,你将收到编译器错误:

Dictionary<string, int> obj = (Dictionary<string, int>)GetDynamic() ?? new Dictionary<string, int>();