У меня есть расширение для строковых массивов, которое возвращает пустую строку, если массив имеет значение 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];
}
И все было хорошо, за исключением того, что по умолчанию (String) это не String.Empty, а 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 и общий для остальных.
null
из метода с именемWhateverOrDefault
для ссылочного типа был бы запутанным, неинтуитивным и, честно говоря, откровенной ложью. Ваш метод говорит одно, вы делаете другое.null
используется по умолчанию дляstring
, а неString.Empty
. Кроме того, зачем проглатывать ошибку, возвращаяarray[0]
, если длина равна1
? Если вызывающий передает неверный индекс, он должен знать об этом, а не тратить время (потенциально) на поиск скрытой ошибки. - person Ed S.   schedule 05.07.2011