以Tuple.Create方式键入推断

时间:2015-09-23 18:09:52

标签: c# visual-studio

我很难理解为什么类型推断不起作用。我有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#类型系统的专家。你能帮我找一个让我的样品运转的方法吗?

1 个答案:

答案 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 }));