Симон Моурир дал этот пример :
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
, где unboxing преобразование (литье) из object
(или из одного из классов System.ValueType
или System.Enum
или из типа интерфейса) - тип значения (кроме Nullable<>
) сам по себе дает NullReferenceException
.
В другом направлении конверсия бокса из a Nullable<>
, которая имеет HasValue
, равную false
, на ссылочный тип, может дать ссылку null
, которая затем может привести к NullReferenceException
. Классический пример:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:
public static void MyExtension(this object x)
{
x.ToString();
}
следующий код будет проблематичным:
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<>
экземпляров.
Да, можно восстановить удаленную ветку из git.
Если у вас была ветка в локальном git repo в течение последних 30 дней, вы можете найти его в reflog , используя следующее:
git reflog
Искать имя ветки в рефлоге и отметить HEAD{x}
или идентификатор фиксации.
git checkout -b branch_name HEAD@{27}
Вы можете проверить идентификатор фиксации и создать ответвление этой точки фиксации:
git checkout -b branch_name <commit id>
git reflog
покажет вам историю HEAD
. Если удаленная ветка была названа foo
, то в этом выходе вы должны увидеть строки, такие как 48534f5 HEAD@{0}: checkout: moving from master to foo
или 48534f5 HEAD@{1}: merge foo: Fast-forward
. Вы можете выполнить поиск вывода git reflog
, чтобы выяснить, какой фиксатор должен быть последним, на который указывает foo.
Поймите, что сам файл foo reflog удаляется, когда foo был удален, но поскольку рефлектор HEAD отличается, он все еще существует.
Можно запросить поддержку GitHub и заглянуть в reflog
вашего удаленного репо (, например, в этом потоке, например ). Если это значение достаточно близко (менее 30 дней по умолчанию) от удаления, reflog все еще содержит коммиты, на которые больше не ссылается ни одна ветка. Создание ветви на одном из этих коммитов позволяет им снова быть доступными.
Подробнее о reflog см. В разделе «, что это за рефлок и почему это так важно? "
Обновление: владелец репо также может запросить API-интерфейсы GitHub: См. « Сохраняет ли GitHub фиксацию идентификаторов? "
Когда ветка удалена в течение очень долгого времени (в моем случае, 1 год), но вы открыли запрос на перенос для этой ветки, вы можете восстановить ее, выполнив поиск в истории запросов на тягу.
Как только я нашел запрос на растяжение для этой ветви, я смог восстановить ветвь. Соответствующая информация о фиксации и т. Д. Также доступна по запросу pull.
Взгляните на этот скрипт python для событий github. https://github.com/jimzucker/githubutils/blob/master/githubreflog.py
Я создал его, чтобы вытащить события и сделать их доступными для чтения, вы можете подключить его к grep и найдите интересующую вас ветку. Если в истории достаточно истории, вы увидите событие удаления для рассматриваемой ветки, следующая строка будет последним событием push, и это вас интересует.