让我们看看下面的代码。
String playStoreUrl = "market://details?id=" + getActivity().getApplicationContext().getPackageName();
ArrayList<String> links = new ArrayList<String>();
links.add(data.getLink());
links.add(playStoreUrl);
Intent sharingIntent2 = new Intent(Intent.ACTION_SEND_MULTIPLE);
sharingIntent2.putExtra(Intent.EXTRA_SUBJECT, content.getSubject());
sharingIntent2.putStringArrayListExtra(Intent.EXTRA_TEXT, links);
sharingIntent2.setType("text/plan");
startActivity(Intent.createChooser(sharingIntent2, "Share this content"));
为什么最后的作业不可能?这种行为的原因是什么?
答案 0 :(得分:1)
请参阅MSDN:
取消装箱转换的结果是一个临时变量。编译器阻止您修改此类变量,因为当临时变量消失时,任何修改都会消失。要解决此问题,请声明一个新的值类型变量来存储中间表达式,并将取消装箱转换的结果分配给该变量。
答案 1 :(得分:1)
由于s
是struct
(又名:a value type), (SPoint)o
是数据的副本 强>:
来自C#语言规范(§1.3,“类型和变量”):
当值类型的值转换为类型对象时,将分配一个对象实例(也称为“框”)来保存该值,并将该值复制到该框中。相反,当对象引用转换为值类型时,将检查引用的对象是否为正确值类型的框,如果检查成功,则复制框中的值。
该语言可以保护您 更改克隆值类型的数据 ,而无需将其放入变量中首先,因为您可能认为在更改它的临时(非变量)克隆时正在更改原始s.x
值,这与C ++ / CLI之类的不安全语言不同,可能允许这种分配。
如果需要,您可以明确地创建一个新变量并在其中进行操作:
SPoint cloneOfS = ((SPoint)o);
cloneOfS.x = 5;