Это проблема, связанная с тем, как работает динамическая система: средство связывания во время выполнения имеет проблему с преобразованиями из System.Object
, но на практике это не проблема.
Я подозреваю, что это потому, что dynamic
,во время выполнения само по себе всегда System.Object
.Спецификация языка C # в 4.7 гласит: «Динамический тип неотличим от объекта во время выполнения».Таким образом, любой объект, используемый как динамический, просто сохраняется как объект.
Когда вы помещаете фактический экземпляр System.Object
в динамический объект, в разрешении привязки времени выполнения происходит что-то, что вызывает исключение нулевой ссылки.
Однако любой другой тип , который не System.Object
, работает - даже ссылочные типы и тому подобное, без недостатков.Таким образом, это должно обеспечить вам правильное поведение, поскольку на самом деле нет никаких причин создавать экземпляр самого System.Object
, который бы передавался по кругу - вам всегда нужен некоторый подкласс с другой информацией о типах.
Как только вы используете какой-либо «настоящий» тип, это прекрасно работает.Например, следующие работы, даже если они переданы и обработаны как Object
:
public class Program
{
public static T TryGetArrayValue<T>(object[] array_, int index_)
{
dynamic boxed = array_[index_];
return (T)boxed;
}
private static void Main()
{
int p = 3;
object a = p;
var objects = new[] { a, 4.5 };
// This works now, since the object is pointing to a class instance
object v = TryGetArrayValue<object>(objects, 0);
Console.WriteLine(v);
// These both also work fine...
double d = TryGetArrayValue<double>(objects, 1);
Console.WriteLine(d);
// Even the "automatic" int conversion works now
int i = TryGetArrayValue<int>(objects, 1);
Console.WriteLine(i);
Console.ReadKey();
}
}