c#-如何在具有约束的泛型类中实现非泛型接口

c#-如何在具有约束的泛型类中实现非泛型接口,c#,generics,interface,implements,C#,Generics,Interface,Implements,这是我的密码: public interface ICar { CarModel Property { get; set; } CarModel Method(); } public Car<T> : ICar where T : CarModel { T Property { get; set; } T Method() { //Do Stuff } } 公共接口ICar { CarModel属性{get;set

这是我的密码:

public interface ICar
{
    CarModel Property { get; set; }
    CarModel Method();
}

public Car<T> : ICar where T : CarModel 
{
    T Property { get; set; }
    T Method()
    {
        //Do Stuff
    }
}
公共接口ICar
{
CarModel属性{get;set;}
CarModel方法();
}
公共汽车:ICar,其中T:CarModel
{
T属性{get;set;}
T方法()
{
//做事
}
}
我已经在我的
Car
类中使用通用约束实现了接口,但它没有编译,出现以下错误:

Compilation error (line 18, col 15): 'Car<T>' does not implement interface member 'ICar.Property'. 'Car<T>.Property' cannot implement 'ICar.Property' because it does not have the matching return type of 'CarModel'.
Compilation error (line 18, col 15): 'Car<T>' does not implement interface member 'ICar.Method()'. 'Car<T>.Method()' cannot implement 'ICar.Method()' because it does not have the matching return type of 'CarModel'.
编译错误(第18行,第15列):'Car'未实现接口成员'ICar.Property'Car.Property'无法实现'ICar.Property',因为它没有匹配的返回类型'CarModel'。
编译错误(第18行,第15列):“Car”未实现接口成员“ICar.Method()”Car.Method()'无法实现'ICar.Method()',因为它没有匹配的返回类型'CarModel'。
我还需要非通用的接口,下面是一个.Net fiddle:

我唯一能做的就是用实现接口的东西来包装属性或方法,但我不想这样做。即:

public Car<T> : ICar where T : CarModel 
{
    T Property { get; set; }
    T Method()
    {
        //Do Stuff
    }

    CarModel ICar.Property 
    { 
      get {return Property; }
      set {Property = (CarModel)value; }
    }

    CarModel ICar.Method()
    {
        return (CarModel)Method();
    }
}
公共汽车:ICar,其中T:CarModel
{
T属性{get;set;}
T方法()
{
//做事
}
卡莫德尔伊卡酒店
{ 
获取{return Property;}
设置{Property=(CarModel)值;}
}
CarModel ICar.方法()
{
return(CarModel)方法();
}
}

有更好的办法吗?

这是办不到的。如果编译器允许您这样做,那么结果将不会是类型安全的。如果允许类型按照您想要的方式编译,那么编译器将允许此代码

public class CarModel {
    public string Name { get; set; }
}

public class Toyota : CarModel {
    public string SpecialToyotaNumber { get; set; }
}

public class Honda : CarModel { }

public interface ICar {
    CarModel Property { get; set; }
    CarModel Method();
}

public class Car<T> : ICar where T : CarModel {
    public T Property { get; set; }

    public T Method() {
        return (T)new CarModel();
    }
}

public class Main {
    public void Run() {
        ICar car = new Car<Toyota>();
        car.Property = new Honda(); // the concrete property is declared Toyota
    }
}
公共类CarModel{
公共字符串名称{get;set;}
}
公共级丰田:CarModel{
公共字符串specialToytanumber{get;set;}
}
公共级本田:卡莫代尔{}
公共接口ICar{
CarModel属性{get;set;}
CarModel方法();
}
公共级汽车:ICar,其中T:CarModel{
公共T属性{get;set;}
公共T方法(){
返回(T)新CarModel();
}
}
公共班机{
公开募捐{
ICar汽车=新车();
car.Property=new Honda();//具体属性声明为Toyota
}
}

生成错误是什么,看起来您的实现方法没有返回值。您的设计中是否允许
Car
?(
MyCarModel
继承自
CarModel
)@markmnl,很抱歉,我在编写过程中的错误导致了以下更改:above@DannyChen查看.Net提琴,它显示了你的要求,但仍然存在错误。你不想做的事情是实现你所说的你想实现的最好方式。(除了setter应该有
Property=(T)值;
而不是
Property=(CarModel)值
。但是,这确实增加了运行时错误的可能性,如@recursive的答案中所示