Обычно обработка struct S в качестве интерфейса I приведет к автобоксированию структуры, которая может иметь влияние на производительность, если это делается часто. Однако, если я напишу общий метод, берущий параметр типа T : I и вызывая его с помощью S, тогда компилятор опустит бокс, так как он знает тип S и не должен использовать интерфейс?
Этот код показывает мою точку зрения:
interface I{
void foo();
}
struct S : I {
public void foo() { /* do something */ }
}
class Y {
void doFoo(I i){
i.foo();
}
void doFooGeneric<T>(T t) where T : I {
t.foo(); // <--- Will an S be boxed here??
}
public static void Main(string[] args){
S x;
doFoo(x); // x is boxed
doFooGeneric(x); // x is not boxed, at least not here, right?
}
}
Метод doFoo вызывает foo() объекта типа I, поэтому, как только мы назовем его S, этот S получит коробку. Метод doFooGeneric делает то же самое. Однако, как только мы вызываем его с помощью S, автооблок не требуется, поскольку среда выполнения знает, как вызвать foo() на S. Но это будет сделано? Или будет ли окно S вслепую в I вызвать метод интерфейса?