为什么泛型方法中的动态参数在使用Object时会抛出空引用异常?

pvi*_*ill 14 c# generics dynamic

我想知道是否有人可以在此代码中解释原因

public class SomeClass
{
    public T GenericMethod<T>(dynamic value)
    {
        return (T)value;
    }
}
Run Code Online (Sandbox Code Playgroud)

'回归价值;' 调用时,语句抛出空引用异常:

new SomeClass().GenericMethod<object>(new object()); // throws System.NullReferenceException
Run Code Online (Sandbox Code Playgroud)

调用时,它按预期工作:

new SomeClass().GenericMethod<string>("SomeString"); // returns SomeString
new SomeClass().GenericMethod<object>("SomeString"); // returns SomeString
Run Code Online (Sandbox Code Playgroud)

注意:以下编译并运行正常

public class SomeOtherClass
{
    public T GenericMethod<T>(object value)
    {
        return (T)value;
    }
}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

mar*_*k_h 3

看来这是 2012 年首次报告的错误,但显然仍未修复(截至 2016 年 5 月 24 日)