2015-02-08 4 views
4

Для этого кода:IL ограничен вызов

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(new MyStruct().ToString()); 
    } 

    struct MyStruct { } 
} 

С # компилятор генерирует constrained callvirt IL код.

This статье говорится:

Например, если тип значения V переопределяет метод Object.ToString(), а V.ToString вызова() инструкция испускается; если это не так, выдается команда box и инструкция Object.ToString() callvirt. Проблема с версией может возникнуть < ...> если позднее будет добавлено переопределение.

Итак, мой вопрос: почему это будет проблемой в этом случае, если компилятор будет генерировать код box, а не ограниченный вызов?

+0

не ссылка вы предоставили уже объясняет, как раз перед вашей цитатой: «Использование ограниченно Приставка также позволяет избежать потенциальных проблем с версиями с типами значений Если ограничен префикс не используются, различный IL должен выделяться в зависимости. о том, переопределяет ли тип значения метод System.Object. " –

+0

@ Selman22, поэтому прошу. Я не понимаю, почему это не может быть просто boxwirt для обоих случаев. – aush

ответ

7

Инструкция box создает копию рассматриваемого экземпляра. Экземплярным методам типов значений разрешено изменять экземпляр, на который они вызваны, и если они это делают, то молча вызвать метод на копии - это не то, что нужно сделать.

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(); 
     } 
    } 
} 
Смежные вопросы