Я пишу эмулятор, и я наткнулся на интересную ошибку:Generic тип ограничения не прилагая
error CS0311: The type 'T' cannot be used as type parameter 'T' in the generic type or method
'Emulator.Emulator<T>'
. There is no implicit reference conversion from 'T' to'Emulator.Emulator<T>.EmulatorState'
.
Ошибка на следующий код (в частности Т на Emulator.IOpcode):
protected abstract class Chip8Opcode<T> : Emulator<T>.IOpcode where T : Chip8.Chip8State
упрощенный код ниже (ideone):
public abstract class Emulator<T> where T : Emulator<T>.EmulatorState
{
public abstract class EmulatorState { }
public interface IOpcode
{
bool IsValid(T state);
void Execute(T state);
}
}
public class Chip8 : Emulator<Chip8.Chip8State>
{
public class Chip8State : EmulatorState { }
}
abstract class Chip8Opcode<T> : Emulator<T>.IOpcode where T : Chip8.Chip8State
{
}
в моем понимании Т ш ould должен быть ограничен Chip8State, который может быть преобразован в EmulatorState (что и требует эмулятор <>), однако, похоже, что ограничение общего типа не применяется к T
в Emulator<T>
, так как ошибка является «Тип« T », «а не« Тип «Chip8State» ». Является ли это ошибкой в компиляции или есть лучший способ применить ограничения типа к унаследованным генерикам?
Примечание: это не дубликат подобных вопросов о столкновениях типов, поскольку T никогда не рассматривается как ограниченный тип.
Кроме того: существуют общие возможности, позволяющие легко расширить эмулятор, если потребуется, хотя было бы неплохо узнать, есть ли лучший способ сделать это.
"Является ли это ошибка в компиляции?" - конечно, не в этом случае, и, откровенно говоря, в значительной степени следует предположить, что это случай, хотя и крайне редко. Во всяком случае, я не знаю, что именно вы здесь хотите, но ошибка здесь довольно ясна: 'T' не наследует тип, вложенный внутри' Emulator ', как требует ограничение; вместо этого он наследует тип, вложенный внутри 'Chip8'. Тип 'Emulator .EmulatorState' является полностью отличным типом от' Chip8.EmulatorState'. –
@PeterDuniho Chip8.EmulatorState не определен, Chip8.Chip8State расширяет EmulatorState, что и требует общее ограничение на T в эмуляторе. Даже если он был отдельным, компилятор все еще не применяет ограничения к T, как показано в ошибке – Qwerty01
Да, я понимаю. Я просто замалчивал имя типа. Замените 'Chip8.EmulatorState' на' Chip8.Chip8State' в моем комментарии (комментарий слишком старый для меня для редактирования) –