Не могу привести int к T, где T это bool. Есть ли способ сделать это с C #? - PullRequest
1 голос
/ 30 декабря 2010

Я постараюсь быть быстрым, так как я уже провел исчерпывающий поиск по этой теме, и я нахожу только темы, связанные с преобразованием bool в int.

Я создал класс для обработки разреженных матриц. Они могут быть заполнены double, int или bool, или любым другим типом значения.

Чтобы получить некоторый матричный элемент в позиции i, j:

public T getElementValueAt(int i, int j)
{
    int ind = this.doesElemExist(i, j); 
         // returns the element index if it exists, or -1
    return (ind == -1 ? (T)(object)0 : this.elem[ind].value );
}

Прежде чем продолжить, один из них освещает вышеупомянутые плохие практики, а другой - разреженные матрицы:

  1. Я искал и обнаружил, что (T)(object)0 не является хорошей практикой, но я не понимаю, почему я не могу использовать его здесь, так как он работает, является ли T целым или двойным;

  2. Если элемент, который я хочу получить, отсутствует в списке this.elem, я должен вернуть 0, набранный правильно, в соответствии с типом других элементов.

Таким образом, все сводится к преобразованию значения типа int (в данном случае 0) в определенный тип T, который является параметром типа.

Есть ли хороший способ сделать это? Любые комментарии об этом подходе?

Любая помощь будет оценена!

Заранее спасибо!

Ответы [ 4 ]

9 голосов
/ 30 декабря 2010

Ваш каст (T)(object)0 не будет работать, если T равен double ... он выбросит InvalidCastException, когда попытается распаковать в штучной упаковке int на double.

Я подозреваю, что вы на самом деле хотите это default(T), что дает значение по умолчанию, равное T, так что для ссылочного типа - ноль, для числовых типов - ноль,

return ind == -1 ? default(T) : this.elem[ind].value;

В качестве дополнительного примечания я рекомендую вам придерживаться соглашений об именах .NET, включая PascalCase для методов.

Три других варианта:

  • Используйте Nullable<T>, как предлагается в других ответах
  • Следуйте подходу TryXXX, возвращающему логическое значение, чтобы указать, был ли элемент найден, и используйте параметр out для получения самого значения
  • Используйте модифицированную версию шаблона TryXXX, где вы возвращаете Tuple<bool, T> вместо использования out параметра
5 голосов
/ 30 декабря 2010

Вы можете использовать значение по умолчанию (T). Но вы также должны рассмотреть возможность использования обнуляемых типов. (функция должна возвращать T? где T: struct).

1 голос
/ 30 декабря 2010

Рассматривали ли вы возврат по умолчанию (T) вместо 0?

1 голос
/ 30 декабря 2010

Использовать следующее:

Convert.ToBoolean(int);
...