Почему мне приходится явно указывать тип при добавлении в список?

117
10 октября 2021, 23:50

Имеется простой на вид код:

/// <summary>
///     Description for video, audio tracks and subtitles.
///     It contains id, name (description string).
/// </summary>
public interface ITrack
{
    /// <summary>
    ///     Track Id.
    /// </summary>
    int Id { get; }
    /// <summary>
    ///     Track name.
    /// </summary>
    string Name { get; }
}
internal class TrackDescription : ITrack
{
    public int Id { get; set; }
    public string Name { get; set; }
}
internal unsafe struct Track
{
    internal int Id;
    internal IntPtr Name;
    internal Track* Next;
    public static unsafe implicit operator TrackDescription(Track track)
    {
        byte[] bytes = null;
        int size = 0;
        sbyte* bytePtr = (sbyte*)track.Name;
        while (*bytePtr != 0)
        {
            size++;
            bytePtr++;
        }
        Marshal.Copy(track.Name,bytes, 0, size);
        return new TrackDescription
        {
            Id = track.Id,
            Name = Encoding.UTF8.GetString(bytes)
        };
    }
    public static unsafe implicit operator LinkedList<ITrack>(Track track)
    {
        Track* current = &track;
        LinkedList<ITrack> list = new LinkedList<ITrack>();
        while (current != null)
        {
            list.AddLast((TrackDescription)(*current));
            current = current->Next;
        }
        return list;
    }
}

Почему при добавлении в список элемента, мне приходится явным образом указывать каст к типу TrackDescription который должен реализовать интерфейс?

Т.е. я не могу просто разыменовать указатель, и предположить вызов оператора преобразования list.AddLast((*current));, ведь оператор помечен как implicit, а толку от него нет?

READ ALSO
Как вращать объект вокруг своей оси?/Unity3d

Как вращать объект вокруг своей оси?/Unity3d

Есть шар который я хочу вращать вокруг своей оси вперед

149
Пул временных портов

Пул временных портов

Возникла задача по реализации OAuth fat клиента при уже существующем серверном приложенииПроблема в том, что клиент может быть подключен к серверу...

259
Как лучше реализовать класс оружия?

Как лучше реализовать класс оружия?

Допустим, есть класс Player, который внутри себя хранит экземпляр интерфейса IWeapon

175
Daemon на MonoDevelop (C#)

Daemon на MonoDevelop (C#)

Мне нужно написать аналог Windows Service под Linux на MonoDevelop, который будет запускаться/завершаться из-под другой программы (как дочерний процесс)Реально...

94