我有一个通用的方法与这个(虚拟)代码(是的我知道IList有谓词,但我的代码不使用IList但其他一些集合,无论如何这与问题无关...)
static T FindThing(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)'."
我可以避免这个错误吗?
两种选择:
返回default(T)
表示null
如果T是引用类型(或可空值类型),0
for int
,'\0'
for char
等,则返回(默认值表(C#Reference))
将T限制为具有where T : class
约束的引用类型,然后null
正常返回
return default(T);
你可以调整你的约束:
where T : class
然后返回null是允许的.
将类约束添加为泛型类型的第一个约束.
static T FindThing(IList collection, int id) where T : class, IThing, new()
如果你有对象则需要进行类型转换
return (T)(object)(employee);
如果你需要返回null.
return default(T);
以下是您可以使用的两个选项
return default(T);
要么
where T : class, IThing return null;
您的另一个选择是将此添加到您的声明的末尾:
where T : class where T: IList
这样它将允许您返回null.