【发布时间】:2011-05-18 15:32:05
【问题描述】:
按照这个答案后,我发现我必须使用ref 参数来调用结构上的实例方法。
How can I create an open Delegate from a struct's instance method?
我似乎无法绑定到显式接口实现之类的方法覆盖(以避免相关的装箱惩罚,(就 IL 而言,这实际上是覆盖)), 这是一个错误报告,说在 .NET 的未来版本中,我们可以绑定到结构上的接口成员: https://connect.microsoft.com/VisualStudio/feedback/details/574959/cannot-create-open-instance-delegate-for-value-types-methods-which-implement-an-interface?wa=wsignin1.0#details
但即使尝试绑定到 Equals、GetHashCode 或 ToString 这样的成员也会导致错误
例如
public struct A
{
public override int GetHashCode(){/*implementation goes here*/}
}
delegate TRet FuncByRef<TStruct,TRet>(ref TStruct) where TStruct:struct
...
Delegate.CreateDelegate(typeof(FuncByRef<A,int>),typeof(A).GetMethod("GetHashCode"));
将失败,并出现“错误绑定到目标方法”异常。
【问题讨论】:
-
重新拳击开销/虚拟;请注意,接口处理仅适用于受约束的操作码,通常通过通用约束。虚拟方法的处理取决于它是否被覆盖(然后它可以使用静态调用)或没有(虚拟调用)。
-
@Marc Gravell,我不确定这是否正确,例如,我可以在表达式树中调用
Int32.ToInt64(null),并且似乎没有任何拳击。由于该方法的执行速度比我首先将其转换为IConvertible