gpt4 book ai didi

c# - 通用类型约束不适用

转载 作者:行者123 更新时间:2023-12-01 19:39:02 25 4
gpt4 key购买 nike

我正在编写一个模拟器,遇到一个有趣的错误:

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 处的 T):

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
{
}

据我了解,T 应该限于 Chip8State,它可以转换为 EmulatorState(这是 Emulator<> 所需要的),但是似乎通用类型约束不适用于 TEmulator<T> ,因为错误是“类型‘T’”而不是“类型‘Chip8State’”。这是编译中的错误还是有更好的方法将类型约束应用于继承的泛型?

注意:这与有关类型冲突的类似问题并不重复,因为 T 从未被视为受约束类型。

此外:泛型已经就位,以便以后需要时可以轻松扩展模拟器,不过如果知道是否有更好的方法会很高兴。

最佳答案

解决我使用的问题的另一种方法是为每个类创建一个接口(interface)并让它们实现它,这使得协变和逆变能够在以后的类中正确应用。

interface IEmulator<out T> where T : IEmulatorState
{ ... }
public interface IEmulatorState
{ ... }

这允许:

public abstract class Emulator<T> : IEmulator<T> where T : IEmulatorState
{ ... }

public interface IOpcode<in T> where T : IEmulatorState
{ ... }

最重要的是

abstract partial class Chip8Opcode<T> : IOpcode<T> where T : Chip8<T>.Chip8State
{ ... }

关于c# - 通用类型约束不适用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28058993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com