使用通用和接口约束:您能否解释此代码上的错误

时间:2018-10-30 20:54:06

标签: c#

我收到以下错误:

  

错误CS0311类型'ConsoleApp1.Diesel'不能用作通用类型或方法'Car'中的类型参数'T'。没有从'ConsoleApp1.Diesel'到'ConsoleApp1.Fuel'的隐式引用转换。 ConsoleApp1

为什么不能使用通用和接口进行约束?

module circuit1 (A, B, C, D, E, F);

input A, B, C, D, E;
output F; 
wire w1, w2, w3, w4, w5; 

nand G1 (w1, A, B);
or G2 (w2, C, D); 
nor G3 (w3, E, C);
nor G4 (w4, w1, w2);
nand G5 (w5, w2, w3);
xor G6 (F, w4, w5);


endmodule

3 个答案:

答案 0 :(得分:1)

您已经用Car<T>语句约束了where类,该语句说T必须为FuelIVehicleDiesel类既不是Fuel也不是IVehicle,这会导致您的编译器错误。

我想您想让Diesel成为Fuel,在这种情况下,您可以这样定义它:

public class Diesel : Fuel { }

应该使您的代码编译正常。

答案 1 :(得分:1)

首先,您的类Diesel需要继承自Fuel

public class Diesel : Fuel { }

接下来,您的Engine<F>应该有一个约束,其中FFuel的某种类型:

public class Engine<F> where F : Fuel
{
    public void Start()
    { }

    private void TransformFuelToEnergy()
    { }
}

最后,您的Car<T>应该实现IVehicle并包含Fuel的约束:

public class Car<T> : IVehicle where T : Fuel
{
    private Engine<T> engine = new Engine<T>();

    public void StartEngine()
    {
        engine.Start();
    }
}

您的Car<T>类然后提供StartEngine方法来满足该接口,该方法对私有变量Engine<T>(需要初始化)起作用。

答案 2 :(得分:0)

使用时

  

其中T:燃料,车辆

这需要您传入的类从抽象类和接口中实现。

public class Diesel : Fuel, IVehicle
{
    public void StartEngine()
    {
        throw new NotImplementedException();
    }
}