我有一个字符串数组的扩展名,如果数组为null,则返回一个空字符串;如果数组长度为== 1,则返回第一个元素,否则返回索引位置的元素,不检查边界。
public static Strings IndexOrDefault(this String[] arr, Int32 index)
{
if (arr == null)
return String.Empty;
return arr.Length == 1 ? arr[0] : arr[index];
}
现在,我需要将此功能扩展到其他阵列,所以我认为这种扩展方法可以完成这项工作
public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
if (arr == null)
return default(T);
return arr.Length == 1 ? arr[0] : arr[index];
}
一切都很好,除了default(String)不是String.Empty但是null。所以我现在为Strings返回空值,这是第一个要求......
是否存在可以返回空泛型值而不是null的默认替换?
编辑2 :(第一个是定义)
我现在正在使用这种方法,它可以工作,但它并不像我想的那么优雅(好吧,方法也不优雅,但解决方案可以:))
public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
if (arr == null)
return default(T);
return arr.Length == 1 ? arr[0] : arr[index];
}
public static String IndexOrDefault(this String[] arr, Int32 index)
{
if (arr == null)
return String.Empty;
return arr.Length == 1 ? arr[0] : arr[index];
}
两种不同的方法,一种用于String,另一种用于其余方法。
答案 0 :(得分:3)
对于引用类型,除了null之外没有通用默认值,对于值类型
,没有0的一些变体您可以轻松提供一个
public static T IndexOrDefault<T>(this T[] arr, Int32 index, T theDefaultValue)
{
if (arr == null)
return theDefaultValue;
return arr.Length == 1 ? arr[0] : arr[index];
}
public static T IndexOrDefault<T>(this T[] arr, Int32 index, Func<T> defaultFactory)
{
if (arr == null)
return defaultFactory();
return arr.Length == 1 ? arr[0] : arr[index];
}
答案 1 :(得分:1)
或第一个元素,如果数组在索引位置没有元素
不完全。如果数组的长度为1,则该方法返回第一个元素,但它根本不检查索引。你所描述的内容宁愿是这样的:
public static Strings IndexOrDefault(this String[] arr, Int32 index) {
if (arr == null || arr.Length == 0) return String.Empty;
if (index >= arr.Length) return arr[0];
return arr[index];
}
通用版本将是:
public static T IndexOrDefault<T>(this T[] arr, Int32 index) {
if (arr == null || arr.Length == 0) return default(T);
if (index >= arr.Length) return arr[0];
return arr[index];
}
是否存在可以返回空泛型值而不是null的默认替换?
不,没有办法为泛型类型获取空值。大多数类型根本没有任何空值。例如,int
不能为空。
答案 2 :(得分:0)
不,null
是string
的默认值。您需要添加专门针对T是字符串进行测试的代码,或者使用不同的方法。
答案 3 :(得分:0)
您可以尝试返回new T()
- 但是您需要在方法声明中添加where T : new
约束。
否则,string的默认值为null。所以下一个选项是创建一个字符串重载......我知道它不是最好的选择,但你可以用它来管理。
答案 4 :(得分:0)
您可以检查“特殊”类型string
。此外,您的代码没有按照您所说的那样做 - 为您修复了一些边缘条件:
public static T IndexOrDefault<T>(this T[] arr, Int32 index)
{
if (arr == null || arr.Length == 0)
return default(T);
return arr.Length <= index ? arr[0] : arr[index];
}
答案 5 :(得分:0)
当您返回T的默认值时会发生什么?