Интересно, если кто-то может объяснить, почему в этом кодеПочему динамический параметр в обобщенном методе генерирует исключение ссылочной ссылки при использовании объекта?
public class SomeClass
{
public T GenericMethod<T>(dynamic value)
{
return (T)value;
}
}
собой «возвращаемое значение;» оператор выдает нулевой ссылочный исключение при вызове с:
new SomeClass().GenericMethod<object>(new object()); // throws System.NullReferenceException
Он работает, как и ожидалось, при вызове с:
new SomeClass().GenericMethod<string>("SomeString"); // returns SomeString
new SomeClass().GenericMethod<object>("SomeString"); // returns SomeString
Примечание: следующие компилирует и работает просто отлично
public class SomeOtherClass
{
public T GenericMethod<T>(object value)
{
return (T)value;
}
}
Штабеля:
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.CSharp.RuntimeBinder.ExpressionTreeCallRewriter.GenerateLambda(EXPRCALL pExpr)
at Microsoft.CSharp.RuntimeBinder.Semantics.ExprVisitorBase.Visit(EXPR pExpr)
at Microsoft.CSharp.RuntimeBinder.ExpressionTreeCallRewriter.Rewrite(TypeManager typeManager, EXPR pExpr, IEnumerable`1 listOfParameters)
at Microsoft.CSharp.RuntimeBinder.RuntimeBinder.BindCore(DynamicMetaObjectBinder payload, IEnumerable`1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding)
at Microsoft.CSharp.RuntimeBinder.RuntimeBinder.Bind(DynamicMetaObjectBinder payload, IEnumerable`1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding)
at Microsoft.CSharp.RuntimeBinder.BinderHelper.Bind(DynamicMetaObjectBinder action, RuntimeBinder binder, IEnumerable`1 args, IEnumerable`1 arginfos, DynamicMetaObject onBindingError)
at Microsoft.CSharp.RuntimeBinder.CSharpConvertBinder.FallbackConvert(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
at System.Dynamic.DynamicMetaObject.BindConvert(ConvertBinder binder)
at System.Dynamic.DynamicMetaObjectBinder.Bind(Object[] args, ReadOnlyCollection`1 parameters, LabelTarget returnLabel)
at System.Runtime.CompilerServices.CallSiteBinder.BindCore[T](CallSite`1 site, Object[] args)
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
Ницца найти! Надеюсь, у некоторых экспертов-компиляторов есть объяснение. –
Я подозреваю, что это имеет какое-то отношение к динамическому приведению в 'T' (хотя фактический тип тот же). Если вы выполняете 'return value as T', это также работает. –
Динамическое ключевое слово сообщает компилятору не применять дополнительные правила к вашему коду, поэтому я думаю, что это разрешено компилировать. Что касается фактического типа возвращаемого значения, то он выглядит так, как будто аргумент ввода значения содержит значение, и кажется, что вы можете использовать значение (например, значение «как T» работает) –