为演示该问题,我准备了以下代码:
public interface IParser<T>
{
bool TryParse(string s, out T result);
}
public sealed class TimeSpanParser : IParser<TimeSpan>
{
public bool TryParse(string s, out TimeSpan result)
{
result = TimeSpan.Zero;
return true;
}
}
public static class ParserService
{
public static T Parse<TParser, T>(string s)
where TParser : IParser<T>, new()
{
var parser = new TParser();
parser.TryParse(s, out var result);
return result;
}
}
致电ParserService.Parse
的方式是
var r = ParserService.Parse<TimeSpanParser, TimeSpan>("");
如您所见,我需要指定TimeSpan
类型的参数。但是Parse
方法的定义是
public static T Parse<TParser, T>(string s)
where TParser : IParser<T>, new()
因此,我认为编译器可以通过T
自动推断TParser
。当我将TimeSpanParser
作为类型参数传递时,我们知道TimeSpanParser
是IParser<TimeSpan>
,所以T
是TimeSpan
。是否可以不指定T
?
赞
var r = ParserService.Parse<TimeSpanParser>("");