当尝试对无法转换为的非泛型类型使用 C#“as”关键字时,编译器会给出无法转换类型的错误。
但是,当对泛型类型使用“as”关键字时,编译器不会给出错误:
public class Foo { }
public class Bar<T> { }
public class Usage<T> {
public void Test() {
EventArgs args = new EventArgs();
var foo = args as Foo; // Compiler Error: cannot convert type
var bar = args as Bar<T>; // No compiler error
}
}
我在一个更大的代码库中发现了这种行为,其中缺少编译时错误导致了运行时出现问题。
这种冲突行为是故意设计的吗?如果是这样,有人知道为什么吗?
In §7.10.11 The as operator
C# 5.0 规范说:
在 E as T 形式的操作中,E 必须是表达式,T 必须是引用类型、已知为引用类型的类型参数或可为 null 的类型。此外,至少以下之一必须为真,否则会发生编译时错误:
So args as Foo
给出一个错误,因为这些都不是真的。但在第二种情况下,Bar<T>
是一种开放类型,规范将开放类型解释为,§4.4.2 Open and closed types
:
开放类型是一种涉及类型参数。进一步来说:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)