我有这个(虚拟)代码的通用方法(是的我知道IList有谓词,但是我的代码不是使用IList而是其他一些集合,无论如何这与问题无关......)
static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}
这给了我一个构建错误
“无法将null转换为类型参数 'T'因为它可能是值类型。 请考虑使用'default(T)'。
我可以避免此错误吗?
答案 0 :(得分:865)
两个选项:
default(T)
,这意味着如果T是引用类型(或可空值类型),null
0
,int
,{}返回'\0'
,char
} where T : class
等等(Default values table (C# Reference))null
约束的引用类型,然后正常返回{{1}} 答案 1 :(得分:77)
return default(T);
答案 2 :(得分:29)
您可以调整约束条件:
where T : class
然后允许返回null。
答案 3 :(得分:11)
将类约束添加为泛型类型的第一个约束。
static T FindThing<T>(IList collection, int id) where T : class, IThing, new()
答案 4 :(得分:6)
您的另一个选择是将此添加到声明的末尾:
where T : class
where T: IList
这样它就可以让你返回null。
答案 5 :(得分:6)
如果你有对象则需要进行类型转换
return (T)(object)(employee);
如果您需要返回null。
return default(T);
答案 6 :(得分:5)
以下是您可以使用的两个选项
return default(T);
或
where T : class, IThing
return null;
答案 7 :(得分:3)
你也可以使用几个值和可空类型来存档它:
static T? FindThing<T>(IList collection, int id) where T : struct, IThing
{
foreach T thing in collecion
{
if (thing.Id == id)
return thing;
}
return null;
}
答案 8 :(得分:2)
出于完整性考虑,很高兴知道您也可以这样做:
return default;
它返回与return default(T);
答案 9 :(得分:1)
采用错误的建议......以及用户default(T)
或new T
。
您必须在代码中添加一个比较,以确保在您走这条路线时它是一个有效的匹配。
否则,可能会考虑“匹配找到”的输出参数。
答案 10 :(得分:1)
这是Nullable Enum返回值的工作示例:
public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct
{
return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value);
}
答案 11 :(得分:0)
上述2个答案的另一种选择。如果将返回类型更改为object
,则可以返回null
,同时强制转换非空返回值。
static object FindThing<T>(IList collection, int id)
{
foreach T thing in collecion
{
if (thing.Id == id)
return (T) thing;
}
return null; // allowed now
}
答案 12 :(得分:0)
对我来说,它是按原样工作的。问题到底在哪里?
public static T FindThing<T>(this IList collection, int id) where T : IThing, new()
{
foreach (T thing in collection)
{
if (thing.Id == id)
return thing;
}
}
return null; //work
return (T)null; //work
return null as T; //work
return default(T); //work
}