考虑以下最小例子:
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运算符的任何一个操作数与预期的返回类型不匹配时,有没有办法强制编译错误?
答案 0 :(得分:1)
为什么编译器不能在这里说出错误(因为对于开发人员来说这很明显)。
因为编写代码的开发人员明确告诉编译器不要检查。当我们使用dynamic
时,我们会有效地告诉编译器关闭静态类型检查。
以这种方式使用dynamic
并不是一个好的设计。如果您不知道返回的类型,那么代码设计存在缺陷,当它返回Dictionary<string, int>
以外的任何内容时,您仍会遇到运行时错误。将dynamic
更改为Dictionary<string, int>
,您将获得所需的编译时错误。
这可能会回答你的问题,但它绝不是一件好事。如果你强制转换dynamic
,你将收到编译器错误:
Dictionary<string, int> obj = (Dictionary<string, int>)GetDynamic() ?? new Dictionary<string, int>();