Будет ли в коде неявное приведение типов
у меня есть набор разных классов, которые мне нужно положить в один список и в дальнейшем с ним работать. Я пытаюсь избежать различных приведений типов(кроме приведения к 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 шт):
Судя по всему при использовании:
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>) + как было сказанно в комментариях, есть упакова при добавлении объектов в коллекцию.