Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.
Пример:
string postalcode=Customer.Address.PostalCode;
//if customer or address is null , this will through exeption
здесь, если адрес имеет значение null, то вы получите NullReferenceException.
Итак, в качестве практики мы всегда должны использовать проверку нуля, прежде чем обращаться к свойствам в таких объектах (особенно в общих)
string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
Можно использовать ковариацию без параметров, но вам нужны две структуры. Например, вы можете поместить параметр out в метод расширения:
SELECT Name, Value
FROM (
SELECT Name, Value, RANK() OVER (ORDER BY Value DESC) AS rk
FROM table
) t
WHERE rk <= 3
T
(принадлежащий типу делегата), который использовался только в параметреout
«позиция», должен быть помечен как covariant i>. Я думал, что объяснение, которое не будет компилироваться, было вопросом, чтоref
иout
являются «теми же». за кулисами. Но ваш последний пример убеждает меня. Это также объясняет, почему для обычных вызовов методов (забыть делегатов и общую дисперсию, подумайте о C # версии 1.2) переменная, помещенная в параметрout
, должна точно указать тип (будучи less производным типом не является ОК). – Jeppe Stig Nielsen 6 September 2012 в 15:50Foo
типаAnimal
в выходной параметр типаDog
, передавая временную переменную типаDog
в подпрограмму, а затем копируя это доFoo
после того, как существует обычная процедура. Концептуально это то, чтоout
должно означать так или иначе. К сожалению, создатели .net не захотели требовать, чтобы языки реализовали параметрыout
, и поэтому .net не может делать какие-либо предположения, которые могли бы сломаться, если вызывающий объект функции обработалout
какref
. – supercat 25 November 2012 в 19:45out
. Но, как указывает Липперт, это не так. Когда вы читаете & quot; из вашего параметраout
вы нарушаете ковариацию. На самом деле, если параметрout
(передан) поле какого-либо класса, другой поток, отличный от вашего, может изменить ссылку параметраout
, чтобы указать на новый объект другого типа времени выполнения, в то время как ваш метод запущен. – Jeppe Stig Nielsen 26 November 2012 в 14:37