
/* Data classes */public class Data{ public int ID { get; set; }}public class InfoData<TInfo> : Data where TInfo: InfoBase{ public TInfo Info { get; set; }}/* Info classes */public abstract class InfoBase{ public int ID { get; set; }}public interface IRelated{ IList<InfoBase> Related {get; set;}}public class ExtraInfo : InfoBase,IRelated{ public string Extras { get; set; } public IList<InfoBase> Related { get; set; }} 然后我有两个这个签名的通用方法:
public TData Add<TData>(TData data) where TData: Datapublic TData Add<TData,TInfo>(TData data) where TData: InfoData<TInfo> where TInfo: InfoBase,IRelated
现在,当我创建一个Data类的实例并调用Add方法时
// data is of type DataAdd(data);
但是当我用更实现的类型对象实例调用相同的方法时
// data is of type InfoData<ExtraInfo>// ExtraInfo is of type InfoBase and implements IRelatedAdd(data);
我希望可以调用第二个泛型方法,但令我惊讶的是它不是.如果我检查第二个上的泛型类型约束是:
where TData: InfoData<TInfo>where TInfo: InfoBase,IRelated
第一个匹配,第二个匹配.如果这有什么不同,这些类型比简单的数据类型更实现.
工作实例
Here是一个有效的.Net小提琴供你玩.
问题
>为什么没有调用第二种方法,因为两种泛型类型约束都匹配并且可以推断出来?
>我如何重写我的第二个Add方法,因此类型推断可以工作,并且不必显式提供这些类型只是为了确保正在使用正确的重载?
编辑
我在MSDN documentation找到了第一个问题的答案
The compiler can infer the type parameters based on the method arguments you pass in; it cannot infer the type parameters only from a constraint or return value.
在我的情况下,第一个泛型类型可以直接从参数推断,但第二个更棘手.它不能仅从参数中推断出来.应该使用类型约束,但编译器不会对其进行评估.
我也有一个可能的解决方案,我的第二个问题,将一种类型改为具体,并保持另一种通用.
public InfoData<TInfo> Add<TInfo>(InfoData<TInfo> data) where TInfo: InfoBase,IRelated
但我想知道是否有更通用/通用的方法来缓解这个问题所以我仍然可以保留两个类型参数,但不知何故两种类型都是通用的?
解决方法 假设您的Add方法位于名为DataCollector的类中;你可以添加接受InfoData< ExtraInfo>的扩展方法.并返回如下所示的相同类型.
public static class DataCollectorExtensions { public static InfoData<ExtraInfo> AddInfoData(this DataCollector dataCollector,InfoData<ExtraInfo> data) { return dataCollector.Add<InfoData<ExtraInfo>,ExtraInfo>(data); } } 这样,您只需在扩展方法中指定一次泛型参数,并在其他地方使用扩展方法,而无需指定泛型参数.
new DataCollector().AddInfoData(new InfoData<ExtraInfo>());
您仍然必须命名除Add之外的方法(我已命名为AddInfoData),否则编译器会再次在DataCollector类中选择公共TData Add< TData>(TData data)方法.正如您实际添加InfoData一样,此方法名称应该是可接受的.我认为这个解决方案应该可以用于所有实际目的.
总结以上是内存溢出为你收集整理的c# – 类型推断如何与重载的泛型方法一起使用全部内容,希望文章能够帮你解决c# – 类型推断如何与重载的泛型方法一起使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)