为什么我不能在结构中使用as关键字?我定义了以下结构:publicstructCall{publicSourceFilecaller;公共SourceFile被调用者;publicCall(SourceFilecaller,SourceFilecallee){this.caller=caller;this.callee=被叫方;稍后,我将它分配给另一个对象的Tag属性:line.Tag=newCall(sf1,sf2);但是当我尝试像这样检索Tag属性时,Callcall=line.TagasCall;VisualStudio给出以下编译时错误:必须引用在类型或可空类型上使用运算符是什么意思?我该如何解决?struct是值类型,因此不能与as运算符一起使用。如果转换失败,则as运算符必须能够分配null。这仅适用于引用类型或可为null的值类型。有几种方法可以解决这个问题,但最好的方法是将调用类型从结构更改为类。这实际上将您的类型从值类型更改为引用类型,这允许as运算符在转换失败时指定空值。有关值类型与引用类型的更多信息,这里有一篇很好的文章。另外,看看MSDN:一些现有的答案不太正确。不能将不可空类型与as一起使用,因为如果第一个操作数实际上不是适当的类型,则as的结果就是该类型的空值。但是,您可以使用值类型...如果它们可以为空:inta=10;对象o=a;诠释?x=o作为整数?;//x是一个值为10long的Nullable?y=o有多长?;//y是具有空值的Nullable,因此您可以使用:Call?call=line.TagasCall?;然后您可以将其用作:if(call!=null){//Dostuffwithcall.Value}但有两个注意事项:我强烈建议您将它作为一个类-这个问题无论如何都会消失。另一个想法:如果Tag应该始终是Call,那么最好将其转换为:Callcall=(Call)line.Tag;这样,如果数据不是您所期望的(即有错误导致标签不是呼叫),那么您可以更快地找到它,而不是在您完成其他工作之后。请注意,根据Call是结构还是类,如果Tag为null,则此转换的行为会有所不同-您可以将null值转换为引用类型(或可空值类型)的变量,但不能转换为非可空值值类型。来自C#规范§7.10.11as运算符用于将值显式转换为给定的引用类型或可空类型。与强制转换表达式(第7.7.6节)不同,as运算符从不抛出异常。相反,如果无法指示转换,则结果值为空。引用和可空类型可以为空。Stucts是值类型,因此它们不能为空。称呼?call=line.TagasCall?;这是C#的限制。如果该类型是引用类型,那么如果转换失败,它只会返回“null”,但由于它是值类型,它不知道如果转换失败要返回什么。您必须替换以下两种用法:'is'和'as'if(line.TagisCall){call=(Call)line.Tag;}else{//如果as返回null,则执行任何操作。有什么意义——如上所述,结构是值类型。HowcanIfixit-changeit以上是C#学习教程:为什么不能在结构体中使用as关键字?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——callcall=line.Tag;本文收集自网络,不代表立场。如涉及侵权,请点击权利联系管理会员删除。如需转载请注明出处:
