从泛型方法调用泛型方法,其中where子句需要强制转换?

时间:2009-08-31 09:40:35

标签: c# .net oop

无法想象这不是一个骗局,但我似乎找不到任何先前匹配的问题。

我有一个通用的方法

public T GetSetting<T>(Guid userId) where T : ISetting, new()

这就是调用泛型方法

public static ISetting CreateSetting<T>(IDictionary<string, object> data) where T:ISetting, new()

T的签名完全相同,但编译器要求我像这样抛出值:

return (T) BaseSetting.CreateSetting<T>(data);

我做错了什么,或者这只是框架的限制?

2 个答案:

答案 0 :(得分:2)

该方法返回类型ISetting。虽然T引用始终是ISetting引用,但ISetting引用不必是T引用。这就是你必须施展它的原因。

答案 1 :(得分:1)

CreateSetting的签名仅表示它返回ISetting。它不要求ISetting必须是T类型。

如果您将签名更改为

public static T CreateSetting<T>(IDictionary<string, object> data) where T:ISetting, new()

它可以在没有施法的情况下工作。