C# 泛型方法是否可以返回对象类型或 Nullable 类型?
例如,如果我有一个安全的索引访问器List
我想返回一个值,稍后我可以使用以下任一方法检查该值== null
or .HasValue()
.
目前我有以下两种方法:
static T? SafeGet<T>(List<T> list, int index) where T : struct
{
if (list == null || index < 0 || index >= list.Count)
{
return null;
}
return list[index];
}
static T SafeGetObj<T>(List<T> list, int index) where T : class
{
if (list == null || index < 0 || index >= list.Count)
{
return null;
}
return list[index];
}
如果我尝试将这些方法组合成一个方法。
static T SafeGetTest<T>(List<T> list, int index)
{
if (list == null || index < 0 || index >= list.Count)
{
return null;
}
return list[index];
}
我收到编译错误:
无法将 null 转换为类型参数“T”,因为它可能是不可为 null 的值类型。考虑使用“default(T)”代替。
但我不想使用default(T)
因为在原语的情况下,0
,这是默认的int
,是一个可能的实际值,我需要将其与不可用的值区分开来。
这些方法是否可以合并为一个方法?
(根据记录,我正在使用 .NET 3.0,虽然我对更现代的 C# 可以做什么感兴趣,但我个人只能使用适用于 3.0 的答案)
这里还有一个您可能没有考虑过的选择......
public static bool TrySafeGet<T>(IList<T> list, int index, out T value)
{
value = default(T);
if (list == null || index < 0 || index >= list.Count)
{
return false;
}
value = list[index];
return true;
}
这可以让你做这样的事情:
int value = 0;
if (!TrySafeGet(myIntList, 0, out value))
{
//Error handling here
}
else
{
//value is a valid value here
}
在顶部,它与TryXXX
许多其他类型集合,甚至转换/解析 API。从方法的名称中也可以很明显地看出该函数是什么,它“尝试”获取值,如果不能,则返回 false。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)