【发布时间】:2016-02-05 07:38:50
【问题描述】:
我正在努力寻找一种将非泛型接口用作泛型类型约束的场景。下面是一个任意示例,其中非泛型方法 (RideCar2) 比泛型方法 RideCar 更简单。
class Program
{
static void Main(string[] args)
{
var car = new Merc();
RideCar(car);
RideCar2(car);
}
static void RideCar<T>(T t) where T : ICar
{
t.StartEngine();
t.StopEngine();
}
static void RideCar2(ICar car)
{
car.StartEngine();
car.StopEngine();
}
}
public interface ICar
{
void StartEngine();
void StopEngine();
}
public class Merc : ICar
{
public void StartEngine() { Console.WriteLine("Merc start"); }
public void StopEngine() { Console.WriteLine("Merc stop"); }
}
很明显,RideCar2 是一个更好的实现,因为它噪音更小。
是否存在将非泛型接口用作泛型类型约束的场景?
更多示例(根据回复)
- 用作返回类型
static T RideCar(T t) where T : ICar
{
t.StartEngine();
t.StopEngine();
return t;
}
使用普通方法仍然会导致使用泛型方法无用,见下文:
static ICar RideCar(ICar car)
{
car.StartEngine();
car.StopEngine();
return car;
}
- 多个接口
static void RideCar(T t) where T : ICar, ICanTimeTravel
{
t.StartEngine(); // ICar
t.TravelToYear(1955); // ICanTimeTravel
t.StopEngine(); // ICar
}
使用带有多个参数的普通方法仍然会导致使用泛型方法无用,见下文:
static void RideCar(ICar car, ICanTimeTravel canTimeTravel)
{
car.StartEngine();
canTimeTravel.TravelToYear(1955);
car.StopEngine();
}
【问题讨论】:
-
当你需要多个接口约束时
-
看一个例子,泛型方法返回一个泛型类型的值。
-
@Damien_The_Unbeliever 对我来说这将是最好的答案
-
您的示例
static void RideCar(ICar car, ICanTimeTravel canTimeTravel)的问题在于,以这种方式而不是使用通用约束没有任何收获。它使代码不太清晰,因为没有约束告诉调用者汽车和时间机器是同一个设备。