当前位置: 首页 > 编程语言 > C#

为什么“as”运算符在C#中不使用隐式转换运算符?分享

时间:2023-04-11 03:28:01 C#

C#中as运算符为什么不使用隐式转换运算符?我在C#中定义了一个从/到某种类型的隐式字符串转换(伪代码):publicclassMyType{publicstringValue{get;放;}publicstaticimplicitoperatorMyType(stringfromString){returnnewMyType{Value=fromString};}publicstaticimplicitoperatorstring(MyTypemyType){returnmyType.Value;在外部库代码的某处,MyType的实例作为对象参数传递给该方法。该方法的一部分如下所示:privatevoidFoo(objectvalue){//...省略代码varbar=valueasstring//注意value在运行时是MyType的一个实例if(bar!=null)//false,castfails{//...省略代码}}为什么强制转换不使用隐式转换器?我认为这些的重点是启用铸造和透明使用?如果MyType有一个显式转换器,这会起作用吗?如果是这样,(如何)我可以同时拥有两者?顺便说一下,如果类型在编译时是已知的,那么转换肯定有效。这是因为运算符是静态的吗?有没有类似非静态转换运算符的东西?PS实际上我最感兴趣的是编译时行为和运行时行为之间的区别,所以我有一个后续问题:为什么在C#中隐式类型转换运算符在运行时不动态可用?为什么软转换不使用隐式转换器?好吧,基本上是指定语言的方式。来自C#5规范第7.10.11节:如果E的编译时类型不是动态的,则EasT操作产生与EisT相同的结果?(T)(E):(T)null除了E只计算一次。[…]请注意,某些转换(例如用户定义的转换)无法使用as运算符,而应使用强制转换表达式执行。C#语言规范在文档中明确提到了这一点:请注意,某些转换(例如用户定义的转换)不能使用as运算符,而应使用强制转换表达式执行。所以你必须投它。as关键字不考虑用户定义的运算符。您需要使用cast运算符。来自ericlippert的相关帖子在您的情况下,显式或隐式运算符都无法帮助您,因为您试图从对象获取字符串而不是从MyType。要使用户定义的转换运算符起作用,请将实例的时间类型编译为类型MyType而不是对象。因为没有对象到字符串的转换,但是也没有MyType到字符串的转换。想象一下必须调用隐式转换运算符。在这种情况下,任何调用varcastObj=rawObjasSomeType;将要求.NET运行时使用反射来确定“rawObj”对象是否具有转换运算符。显然,这比检查对象是SomeType类型还是它的子类型在计算上更昂贵。拥有一个快速且可预测的运算符比一个更通用但更慢的运算符更好。以上是C#学习教程:为什么“as”运算符在C#中不用隐式转换运算符?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: