C#中的引用和输出参数,不能标记为变体这句话是什么意思?从这里C#中的引用和输出参数不能标记为变体。1)是否意味着不能做下面的事情。publicclassSomeClass:IVariant{publicvirtualRDoSomething(refAargs){returnnull;}}2)或者这是否意味着我不能拥有以下内容。publicdelegateRReader(Aarg,strings);publicstaticvoidAssignReadFromPeonMethodToDelegate(refReaderpReader){pReader=ReadFromPeon;}staticobjectReadFromPeon(Peonp,stringpropertyName){returnp.GetType().GetField(propertyName).获取值(p);}静态阅读器pReader;staticvoidMain(string[]args){AssignReadFromPeonMethodToDelegate(refpReader);bCanReadWrite=(bool)pReader(peon,"CanReadWrite");Console.WriteLine("按任意键退出...");控制台.ReadKey();我试过(2)并且成功了。粗略地说,“出”就是“只出现在输出位置”。粗略地说,“在”的意思是“只出现在进入的地方”。真实的故事比这更复杂,但选择关键词是因为大多数时候。考虑接口的方法或委托的方法:delegatevoidFoo(refTitem);T是否出现在输入位置?是的。调用者可以在via项中传递T值;被调用者Foo可以读取它。因此T不能标记为“out”。T是否出现在输出位置?是的。被调用者可以向项目写入新值,调用者可以读取该值。因此T不能标记为“in”。因此,如果T出现在“ref”表单参数中,则不能将其标记为in或out。让我们看一些出错的真实例子。假设这是合法的:delegatevoidX(refTitem);...Xx1=(refDogd)=>{d.Bark();}Xx2=x1;//协变;动物a=newCat();x2(参考一);好吧,我的猫,我们刚刚制作了猫皮。“出”是违法的。“中”呢?委托无效X(参考T项目);...Xx1=(refAnimala)=>{a=newCat();}Xx2=x1;//逆变;狗d=新狗();x2(参考d);我们只是把一只猫放在一个只能容纳狗的变量中。T也不能标记为“in”。输出参数呢?委托voidFoo(outTitem);?现在T只出现在输出位置。将T标记为“out”是否合法?很不幸的是,不行。“out”在幕后真的和“ref”没什么区别。“out”和“ref”之间的唯一区别是,编译器禁止从out参数读取,直到被调用方对其进行赋值,并且编译器需要在被调用方正常返回之前进行赋值。用C#以外的.NET语言编写此接口的实现的人将能够在初始化之前从此项中读取,因此可以将其用作输入。因此,在这种情况下,我们禁止将T标记为“out”。这很不幸,但我们对此无能为力;我们必须遵守CLR的类型安全规则。此外,“out”参数的规则是它们在写入之前不能用于输入。写入后不能使用任何规则进行输入。假设我们允许委托voidX(outTitem);C类{动物a;voidM(){Xx1=(outDogd)=>{d=null;N();如果(d!=null)d.Bark();};xx2=x1;//假设这是合法的协方差。x2(outthis.a);}voidN(){if(this.a==null)this.a=newCat();}}我们又做了一次猫叫。我们不能让T“出去”。以这种方式为输入输出参数是非常愚蠢的,但是合法的。这意味着您不能有以下声明:publicdelegateRMyDelegate(refAarg);编辑:@EricLippert纠正我,这仍然是合法的:publicdelegatevoidMyDelegate(Aarg,outRs);它实际上是有道理的,因为Rgenerics参数没有标记为变体,所以它不违反规则。但是,这仍然是非法的:publicdelegatevoidMyDelegate(Aarg,outRs);然而,下面的代码编译:interfaceIFoo{TGet();//boolTryGet(输出T值);//不起作用:无效方差:类型参数“T”必须在“IFoo.TryGet(outT)”上始终有效。'T'是协变的。boolTryGet(动作值);//有效!}可以使用out参数的协方差,但是需要两个结构体。比如可以把out参数放在扩展方法上:以上是C#学习教程:C#中的引用和输出参数,不能标记为variant所有内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——publicstaticclassResultExtension{publicstaticboolTryGetValue(thisIResultself,outTres){if(self.HasValue){res=self.Value;返回真;}res=默认值;返回假;}}publicinterfaceIResult{boolHasValue{get;}T值{得到;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
