为什么c#中的未装箱结构右值

时间:2015-10-07 18:40:14

标签: c# .net struct

让我们看看下面的代码。

    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"));

为什么最后的作业不可能?这种行为的原因是什么?

2 个答案:

答案 0 :(得分:1)

请参阅MSDN

  

取消装箱转换的结果是一个临时变量。编译器阻止您修改此类变量,因为当临时变量消失时,任何修改都会消失。要解决此问题,请声明一个新的值类型变量来存储中间表达式,并将取消装箱转换的结果分配给该变量。

答案 1 :(得分:1)

由于sstruct(又名:a value type), (SPoint)o是数据的副本

来自C#语言规范(§1.3,“类型和变量”):

  

当值类型的值转换为类型对象时,将分配一个对象实例(也称为“框”)来保存该值,并将该值复制到该框中。相反,当对象引用转换为值类型时,将检查引用的对象是否为正确值类型的框,如果检查成功,则复制框中的值。

该语言可以保护您 更改克隆值类型的数据 ,而无需将其放入变量中首先,因为您可能认为在更改它的临时(非变量)克隆时正在更改原始s.x值,这与C ++ / CLI之类的不安全语言不同,可能允许这种分配。

如果需要,您可以明确地创建一个新变量并在其中进行操作:

SPoint cloneOfS = ((SPoint)o);
cloneOfS.x = 5;