使用 where T : Interface 的通用扩展方法

Generic extension methods using where T : Interface

这 2 种扩展方法是否相同,或者使用 2 种中的 1 种是否存在一些危险

public static T  GetSomthingFromListOf<T>(this List<T> list)where T: IMyInterface
{
    //do somthing that returns an item of T
}

public static IMyInterface GetSomthingFromList(this List<IMyInterface> list)
{
    //do somthing that returns an item of IMyInterface
}

唯一真正的区别在于 return 类型,第一个将 return 类型本身并对其进行约束,使其必须实现 IMyInterface,第二个将只是 return IMyInterface 个实例。

当您只想公开接口的成员时,第二个很有用;第一个适用于当您 需要 到 return 原始类型时,但请确保您可以在方法中将其视为 IMyInterface.

除了@Clint 回答:

1) 如果您有 List<ConcreteType> 的实例 - 只有通用扩展方法可用

2) 如果您将 struct 作为参数传递给需要接口的非泛型方法 - 将发生装箱