Почему исключение нулевой ссылки в SetMolePublicInstance? - PullRequest
0 голосов
/ 01 апреля 2012

Я получаю исключение "пустая ссылка" в следующей строке:

MoleRuntime.SetMolePublicInstance(stub, receiverType, objReceiver, name, null);

Программа собирается и компилируется правильно.Нет претензий ни к одному из параметров метода.

Вот спецификация SetMolePublicInstance из браузера объектов:

SetMolePublicInstance(System.Delegate _stub, System.Type receiverType, object _receiver, string name, params System.Type[] parameterTypes)

Вот значения параметров для "Locals":

+ stub {Method = {System.String <StaticMethodUnitTestWithDeq>b__0()}} System.Func<string>
+ receiverType {Name = "OrigValue" FullName = "OrigValueP.OrigValue"} System.Type {System.RuntimeType}
objReceiver {OrigValueP.OrigValue} object {OrigValueP.OrigValue}
name "TestString" string
parameterTypes null object[]

Я знаю, что TestString () не принимает параметров и возвращает строку, поэтому в качестве начала, чтобы попытаться заставить все работать, я указал "null" для окончательного параметра SetMolePublicInstance.Как уже упоминалось, это компилируется в порядке.

Вот трассировка стека:

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at     Microsoft.ExtendedReflection.Collections.Indexable.ConvertAllToArray[TInput,TOutput](TInput[] array, Converter`2 converter)
   at Microsoft.Moles.Framework.Moles.MoleRuntime.SetMole(Delegate _stub, Type receiverType, Object _receiver, String name, MoleBindingFlags flags, Type[] parameterTypes)
   at Microsoft.Moles.Framework.Moles.MoleRuntime.SetMolePublicInstance(Delegate _stub, Type receiverType, Object _receiver, String name, Type[] parameterTypes)
   at DeqP.Deq.Replace[T](Func`1 stub, Type receiverType, Object objReceiver, String name) in C:\0VisProjects\DecP_04\DecP\DeqC.cs:line 38
   at DeqPTest.DecCTest.StaticMethodUnitTestWithDeq() in C:\0VisProjects\DecP_04\DecPTest\DeqCTest.cs:line 28
   at Starter.Start.Main(String[] args) in C:\0VisProjects\DecP_04\Starter\Starter.cs:line 14
Press any key to continue . . .

Чтобы избежать нулевого параметра, я изменил окончательный "нулевой" на "parameterTypes", как в следующей строке:

MoleRuntime.SetMolePublicInstance(stub, receiverType, objReceiver, name, parameterTypes);

Я вставил строку:

Type [] parameterTypes = new Type[0];

Использование moles.runner.exe дает желаемые результаты:)

1 Ответ

0 голосов
/ 02 апреля 2012

Компилятор не может проверить исключение NullReferenceException;потому что это исключение во время выполнения.Это исключение означает, что один из объектов, передаваемых в аргументы, имеет значение null, когда ожидается, что он указывает на экземпляр.

Поместите точку останова в эту строку тестового проекта.Запуск теста в режиме отладки прервет эту строку, и вы увидите, какой из аргументов имеет значение null.

...