首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IL约束呼叫

IL约束呼叫
EN

Stack Overflow用户
提问于 2015-02-08 15:01:26
回答 1查看 1.2K关注 0票数 4

对于此代码:

代码语言:javascript
复制
class Program
{
    static void Main()
    {
        Console.WriteLine(new MyStruct().ToString());
    }

    struct MyStruct { }
}

C#编译器生成constrained callvirt IL代码。

的文章说:

例如,如果值类型V覆盖Object.ToString()方法,则发出一个调用V.ToString()指令;如果没有,则发出一个box指令和一个callvirtObject.ToString()指令。如果稍后添加覆盖,则可能会出现版本控制问题<...>。

所以,我的问题是:如果编译器将生成一个box代码,而不是一个受限的调用,为什么在这种情况下会出现问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-08 15:14:29

box指令创建有关实例的副本。值类型的实例方法被允许修改它们被调用的实例,如果它们修改了,那么在副本上静默调用方法是错误的。

代码语言:javascript
复制
static class Program
{
    static void Main()
    {
        var myStruct = new MyStruct();
        Console.WriteLine(myStruct.i); // prints 0
        Console.WriteLine(myStruct.ToString()); // modifies myStruct, not a copy of myStruct
        Console.WriteLine(myStruct.i); // prints 1
    }

    struct MyStruct {
        public int i;
        public override string ToString() {
            i = 1;
            return base.ToString();
        }
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28395401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档