我很难理解为什么类型推断不起作用。我有VS2010(C#4.0)
请考虑示例代码:
public interface IMapping<TRecord> { }
static class DateMapping // Trying to mimic Tuple.Create here
{
public static IMapping<TRecord> Make<TRecord>()
{
return null;
}
}
class DateMapping<TRecord, TReturn> : IMapping<TRecord>
{
public DateMapping(Func<TRecord, TReturn> x)
{
}
}
public static class MappingHelper
{
public static List<IMapping<TRecord>> MakeMappings<TRecord>(this IEnumerable<TRecord> data, IMapping<TRecord> m1)
{
return null;
}
}
class Program
{
static void Main(string[] args)
{
var data = new[]
{
new {a = 1, b = 2},
new {a = 1, b = 2}
};
// The type arguments for method 'TypeInference.MappingHelper.MakeMappings<TRecord>(System.Collections.Generic.IEnumerable<TRecord>, TypeInference.IMapping<TRecord>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. c:\repo\TypeInference\TypeInference\Program.cs
var mappings = data.MakeMappings(DateMapping.Make());
}
}
我不是C#类型系统的专家。你能帮我找一个让我的样品运转的方法吗?
答案 0 :(得分:1)
DateMapping.Make()没有参数,编译器可以从中推断出类型,因此你必须明确指定它(或者在方法中添加一个TRecord参数)。
显式类型参数(不适用于匿名类型):
var data = new[] { 1, 2, 3, 4 };
var mappings = data.MakeMappings(DateMapping.Make<int>());
方法中的TRecord参数:
static class DateMapping
{
public static IMapping<TRecord> Make<TRecord>(TRecord record)
{
return null;
}
}
//...
var data = new[]
{
new {a = 1, b = 2},
new {a = 1, b = 2}
};
var mappings = data.MakeMappings(DateMapping.Make(new { a = 1, b = 2 }));