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

在C#中是否可以通过以下方式重载泛型转换运算符?分享

时间:2023-04-11 02:16:07 C#

在C#中是否可以通过以下方式重载泛型转换运算符?只是想知道在C#3.5中是否还有表示以下内容的代码:publicstructFoo{publicFoo(Titem){this.Item=item;}publicTItem{get;放;}publicstaticexplicitoperatorFoo(Fooa)whereU:T{returnnewFoo((U)a.Item)}}感谢转换运算符不能通用。从规范10.10节开始,这是一个convert-operator-declarator的格式:conversion-operator-declarator:Implicitoperatortype(typeidentifier)Explicitoperatortype(typeidentifier)要比较,比较方法头:方法-header:attributesoptmethod-modifiersoptpartialoptreturn-typemember-nametype-parameter-listopt(formal-parameter-listopt)type-parameter-constraints-clausesopt(抱歉格式化-不要'我不知道如何做得更好。)请注意,运算符格式不包括类型参数列表或类型参数约束。您的代码归结为这一行:returnnewFoo((U)a.Item)您试图将基类分配给继承类,这是不可能的。假设T(基类)是Stream类型,U是MemoryStream类型(继承类),不能将Stream赋值给MemoryStream类型的变量。我认为简短的回答是“不可能的。尝试使用方法”似乎也是解决此问题的愚蠢方法。.NET泛型中的重载运算符约束看起来像你想要一个逆变换,但结构是不可变的,你不能用变换购买任何东西,你可以简单地说newFoo((U)a.Item)正如@Gidon指出的那样。如果你考虑让Foo成为一个类,那么我们可以有所不同:publicinterfaceIFoo{TItem{set;}}publicclassFoo:IFoo{publicFoo(Titem){this.Item=item;}publicTItem{get;set;}//publicstaticexplicitoperatorFoo(Ua){//returnnewFoo((U)a.Item);//}}并像这样使用它:varfoo=newFoo(newobject{});IFoobar=foo;bar.Item="123";varb=Object.ReferenceEquals(foo,bar);//true顺便说下泛型接口的区别仅适用于.netfx4.0以上为C#学习教程:IsithaspossibletooverloadthegenericconversionoperatorinC#infollowingway?分享所有内容,如果对大家有用,还需要进一步了解C#学习教程,希望大家多多关注——本文采集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: