.NET类型推断:无法推断“T GetValue <t>(T defaultValue = default(T))”的使用情况?</t>

时间:2012-07-16 22:01:35

标签: c# .net generics

我有一个简单的方法:

public static T GetValue<T>(SqlDataReader reader, int columnIndex, T defaultValue = default(T))
{
    return reader.IsDBNull(columnIndex) ? defaultValue : (T)reader[columnIndex];
}       

及其用法:

string s = SqlUtils.GetValue<string>(reader, nameOrd);

我问自己,为什么我必须指定<string>如果从使用中可以看出返回参数的类型是字符串?但显然我必须这样做,否则编译器会抱怨The type arguments cannot be inferred from the usage...。我的逻辑在哪里失败了?

1 个答案:

答案 0 :(得分:9)

  

我的逻辑在哪里失败了?

无处。根据规范(25.6.4 Inference of Type Arguments),编译器仅使用参数进行泛型类型推断,而不是返回值(我提醒您在方法调用中省略了默认值参数,因此违反了此​​规则)。因此,如果您想使用C#,规范只会告诉您仅使用返回类型无法进行泛型类型推断。或者只是使用其他一些允许这种情况的CLS语言。 C#没有。