不能将基本类型的变量作为输出参数传递?刚刚注意到这不起作用:vardict=newDictionary();X容器元素;//...if(dict.TryGetValue(idx,outelement)){//...然后我试了这个:classA{}classB:A{}classProgram{staticvoidMain(){Aa;a=返回();//没有错误,正常Ref(refa);//编译器错误,好的...Out(outa);//编译器错误,哈哈?!}staticBRet(){返回空值;}staticvoidRef(refBb){}staticvoidOut(outBb){b=null;}}上次调用它时遇到编译器错误?编辑:好的,所以我从答案中了解到“out”是变相的“ref”,因此它可以被其他函数或线程共享和更改。但实际上,'out'不应该是一种从函数返回多个值的方法吗?因为如果那样的话,它似乎并不擅长。如果分享造成问题,那就不要分享。只需在函数的开头创建一个隐藏变量并使用它。我的意思是:staticvoidOut(outBb){BbHidden;//编译器生成;//所有对b的引用都替换为bHidden;b=b隐藏;有什么理由不能这样做吗?现在对我来说似乎很安全......正如我从答案中了解到的那样,“out”是变相的“ref”,因此它可以被其他函数或线程共享和更改。但实际上,'out'不应该是一种从函数返回多个值的方法吗?因为如果那样的话,它似乎并不擅长。如果分享造成问题,那就不要分享。只需在函数的开头创建一个隐藏变量并使用它。我的意思是:staticvoidOut(outBb){BbHidden;//编译器生成;//所有对b的引用都替换为bHidden;b=b隐藏;有什么理由不能这样做吗?现在对我来说似乎很安全......出于显而易见的原因,这样的系统被称为“复制”系统。它可以做到这一点,但这样做会产生自己有趣的问题。例如:voidM(){intb=1;尝试{N(出b);}catch(FooException){Console.WriteLine(b);}}voidN(outintc){c=123;P();c=456;}voidP(){抛出新的FooException();这个程序的输出是什么?应该是什么?下一个问题:你想要out表现得和ref一样吗?如果你想让它不一致,那么恭喜你,你刚刚给语言添加了一个非常混乱的不一致。如果你希望它是一致的,那么你需要让ref使用“copyincopyout”的语义,这在性能和正确性方面都会带来很多问题。我可以整天列举引用语义和复制语义之间的区别,但我不会。我们得到的系统就是我们已有的系统,所以要学会使用它。还有,如果你想从一个方法返回多个值,不要使用out参数。这在2001年可能是明智之举,但现在是2012年,我们有更多工具供您使用。如果要返回两个值:EricLippert写了这篇文章:http://blogs.msdn.com/b/ericlippert/archive/2009/09/21/why-do-ref-and-out-parameters-not-allow-type-variation.aspx修改你的例子:classA{}classB:A{publicintx;}classProgram{staticvoidMain(){Aa;a=返回();Out(outa,()=>a=newA());}staticBRet(){返回空值;}staticvoidRef(refBb){}staticvoidOut(outBb,Actioncallback){b=newB();打回来();bx=3;//不可能工作,b又是一个a!}}C#规范声明类型必须完全匹配:17.5.1.3输出参数当表单参数是输出参数时,相应的参数应包含关键字out后跟相同的变量引用(§12.3.3.27)类型作为表单参数。如果允许,您可以这样做:classA{}classB:A{publicvoidBOnlyMethod(){}}classC:A{}publicvoidDoIt(){违反(outthis.a);}voidViolate(outBb){b=newB();InnocentModification();//我们认为是B,实际上现在是C,但我们仍然可以这样做:b.BOnlyMethod();//这注定会失败,因为BOnlyMethod不存在于类型C}voidInnocentModification(){this.a=newC();如果没有这样的约束,违反上述类型系统将很容易实现。而且我猜你不希望这种“可能性”出现在你的语言中。问题基本上是:a=Ret()和Out(outa)不应该在逻辑上等价吗?如果是这样,为什么一个有效而另一个无效?如果我理解正确,CLR实际上并没有使用ref,这意味着在幕后Out(outa)被实现为Out(refa),由于显而易见的原因而失败。以上是C#学习教程:基类型的变量不能作为out参数传递吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
