C# 使用完全相同的where子句要求强制转换从泛型方法调用泛型方法?

C# 使用完全相同的where子句要求强制转换从泛型方法调用泛型方法?,c#,.net,oop,C#,.net,Oop,无法想象这不是一个骗局,但我似乎找不到任何以前匹配的问题 我有一个通用方法 public T GetSetting<T>(Guid userId) where T : ISetting, new() public T GetSetting(Guid userId),其中T:ISetting,new() 这又调用了一个泛型方法 public static ISetting CreateSetting<T>(IDictionary<string, object>

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

我有一个通用方法

public T GetSetting<T>(Guid userId) where T : ISetting, new()
public T GetSetting(Guid userId),其中T:ISetting,new()
这又调用了一个泛型方法

public static ISetting CreateSetting<T>(IDictionary<string, object> data) where T:ISetting, new()
公共静态ISetting CreateSetting(IDictionary数据),其中T:ISetting,new()
T的签名完全相同,但编译器要求我按如下方式转换值:

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

是我做错了什么,还是这只是框架的一个限制?

该方法正在返回ISetting类型。虽然T引用始终是ISetting引用,但ISetting引用不必是T引用。这就是您必须强制转换它的原因。

该方法返回类型ISetting。虽然T引用始终是ISetting引用,但ISetting引用不必是T引用。这就是您必须强制转换它的原因。

CreateSetting的签名仅声明它返回ISetting。它不要求ISetting必须是t型

如果您将签名更改为

public static T CreateSetting<T>(IDictionary<string, object> data) where T:ISetting, new()
公共静态T CreateSetting(IDictionary数据),其中T:ISetting,new()
它将在不强制转换的情况下工作。

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

如果您将签名更改为

public static T CreateSetting<T>(IDictionary<string, object> data) where T:ISetting, new()
公共静态T CreateSetting(IDictionary数据),其中T:ISetting,new() 它不用浇铸就可以工作