Будет ли в коде неявное приведение типов

у меня есть набор разных классов, которые мне нужно положить в один список и в дальнейшем с ним работать. Я пытаюсь избежать различных приведений типов(кроме приведения к IContainer в самом начале), поэтому список с каким нибудь общим классом не подойдет. Я написал пример, который, как я думаю поможет этого достичь. Явных приведений здесь нет, будет ли здесь где-то скрыто неявное приведение?

public class TestCast : MonoBehaviour
{

    [SerializeField]
    private MeshFilter meshFilter;
    [SerializeField]
    private MeshRenderer meshRenderer;
    [SerializeField]
    private BoxCollider boxCollider;


    [Button]
    private void DoTest()
    {
        List<IContainer> containers = new List<IContainer>();
        containers.Add(new Container<MeshFilter>(meshFilter));
        containers.Add(new Container<MeshRenderer>(meshRenderer));
        containers.Add(new Container<BoxCollider>(boxCollider));

        for (int i = 0; i < containers.Count; i++)
        {
            containers[i].Print(this);
        }
    }

    private void Print<T>(T component) where T : Component
    {
        // Do something
        Debug.Log(component.GetType());
    }


    public struct Container<T> : IContainer where T : Component
    {
        private T component;

        public Container(T component)
        {
            this.component = component;
        }

        public void Print(TestCast testCast)
        {
            testCast.Print(component);
        }
    }

    public interface IContainer
    {
        void Print(TestCast testCast);
    }
}

Ответы (1 шт):

Автор решения: Dori

Судя по всему при использовании:

where T : Component

будет происхоидить приведение к типу Component.

public struct Container<T>: IContainer  where T : Component
{
    private T component;

    public Container(T component)
    {
        this.component = component;
    }
}

Вот во что превратиться даный код в IL:

.class public sequential ansi sealed beforefieldinit Container`1<(Component) T> //здесь происходит приведение типа
    extends [System.Private.CoreLib]System.ValueType
    implements IContainer
{
    // Fields
    .field private !T component

    // Methods
    .method public hidebysig specialname rtspecialname 
        instance void .ctor (
            !T component
        ) cil managed 
    {
        // Method begins at RVA 0x2062
        // Code size 9 (0x9)
        .maxstack 8

        IL_0000: nop
        IL_0001: ldarg.0
        IL_0002: ldarg.1
        IL_0003: stfld !0 valuetype Container`1<!T>::component
        IL_0008: ret
    } // end of method Container`1::.ctor

} // end of class Container`1

Так что, отвечая на ваш вопрос: здесь будут неявные приведения(<(Component) T>) + как было сказанно в комментариях, есть упакова при добавлении объектов в коллекцию.

→ Ссылка