Попробуйте это
@Query("SELECT * FROM weapon_table WHERE fighter_id IN (:fighter_id)" )
LiveData<List<Weapon>> getFighterWeapons(long fighter_id);
Это нормально (без исключения). Методы расширения не используют виртуальные вызовы (т. Е. В нем используется инструкция «call» il, а не «callvirt»), поэтому проверка на null отсутствует, если вы сами не напишете ее в методе расширения. На самом деле это полезно в некоторых случаях:
public static bool IsNullOrEmpty(this string value)
{
return string.IsNullOrEmpty(value);
}
public static void ThrowIfNull<T>(this T obj, string parameterName)
where T : class
{
if(obj == null) throw new ArgumentNullException(parameterName);
}
и т. Д.
По сути, вызовы статических вызовов очень буквальны - то есть
string s = ...
if(s.IsNullOrEmpty()) {...}
становится:
string s = ...
if(YourExtensionClass.IsNullOrEmpty(s)) {...}
, где явно нет проверки на null.
Есть несколько золотых правил, когда вы хотите, чтобы ваш текст был читабельным и вертикальным.
В вашем случае - DesignByContract не работает ... вы собираетесь выполнить некоторую логику с нулевым экземпляром.
Метод расширения является статическим, поэтому, если вы ничего не делаете для этого MyObject, это не должно быть проблемой, быстрый тест должен проверить это :)
Дополнение к правильному ответу от Марка Гравелла.
Вы можете получить предупреждение от компилятора, если очевидно, что аргумент this имеет значение NULL:
default(string).MyExtension();
Хорошо работает во время выполнения, но выдает предупреждение «Выражение всегда вызывает исключение System.NullReferenceException, поскольку значение по умолчанию для строки равно NULL»
.
Методу расширения будет передано значение null.
Если метод пытается получить доступ к объекту, не проверяя, является ли он нулевым, тогда да, он будет выбросить исключение.
Здесь парень написал методы расширения «IsNull» и «IsNotNull», которые проверяют, передана ли ссылка null или нет. Лично я считаю, что это заблуждение, и оно не должно было появиться на свет, но это вполне корректный C #.
Как вы уже обнаружили, поскольку методы расширения - это просто прославленные статические методы, они будут вызываться с помощью пустые
ссылки переданы без выброса NullReferenceException
. Но поскольку они выглядят для вызывающего объекта как методы экземпляра, они также должны вести себя как таковые. Затем вы должны в большинстве случаев проверять параметр this
и генерировать исключение, если он null
. Это нормально не делать этого, если метод явно заботится о значениях null
и его имя указывает на это должным образом, как в приведенных ниже примерах:
public static class StringNullExtensions {
public static bool IsNullOrEmpty(this string s) {
return string.IsNullOrEmpty(s);
}
public static bool IsNullOrBlank(this string s) {
return s == null || s.Trim().Length == 0;
}
}
Я также написал сообщение в блоге об этом некоторое время назад.