Csharp/C#教程:使用as关键字对C#中的generics类型进行编译时行为冲突分享


使用as关键字对C#中的generics类型进行编译时行为冲突

尝试对无法转换的非generics类型使用C#“as”关键字时,编译器会提供无法转换类型的错误。

但是,当对generics类型使用“as”关键字时,编译器不会给出错误:

public class Foo { } public class Bar { } public class Usage { public void Test() { EventArgs args = new EventArgs(); var foo = args as Foo; // Compiler Error: cannot convert type var bar = args as Bar; // No compiler error } } 

我在更大的代码库中发现了这种行为,其中缺少编译时错误导致运行时出现问题。

设计是否存在冲突行为? 如果是这样,有没有人知道为什么?

§7.10.11 The as operator C#5.0规范说:

在Eforms的操作中,E必须是表达式,T必须是引用类型,已知为引用类型的类型参数或可空类型。 此外,必须至少满足下列条件之一,否则会发生编译时错误:

因此args as Foo给出了一个错误,因为这都不是真的。 但在第二种情况下, Bar是一个开放类型,并且规范解释了开放类型, §4.4.2 Open and closed types

开放类型是涉及类型参数的类型 。 进一步来说:

“请注意,as运算符只执行引用转换,可空转换和装箱转换.as运算符不能执行其他转换,例如用户定义的转换,而应使用转换表达式执行转换。”

https://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

上述就是C#学习教程:使用as关键字对C#中的generics类型进行编译时行为冲突分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/985492.html

(0)
上一篇 2021年12月21日
下一篇 2021年12月21日

精彩推荐