Имеется простой на вид код:
/// <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
, а толку от него нет?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть шар который я хочу вращать вокруг своей оси вперед
Возникла задача по реализации OAuth fat клиента при уже существующем серверном приложенииПроблема в том, что клиент может быть подключен к серверу...
Допустим, есть класс Player, который внутри себя хранит экземпляр интерфейса IWeapon
Мне нужно написать аналог Windows Service под Linux на MonoDevelop, который будет запускаться/завершаться из-под другой программы (как дочерний процесс)Реально...