【发布时间】:2014-06-21 13:43:58
【问题描述】:
我试图弄清楚为什么这不起作用:
public void DefaultAction( object obj = null ){}
public void Start()
{
SomeReferenceType obj;
DefaultAction( obj ); //works
int i;
string s;
DefaultAction( i ); //works
DefaultAction( s ); //works
}
//however...
public event Action OnNullAction = DefaultAction; //works
public event Action<SomeReferenceType> OnObjectAction = DefaultAction; //works
public event Action<int> OnIntAction = DefaultAction; //doesn't work!!
尝试将 void(object) 绑定到 Action<ValueType> 会引发参数不匹配错误,即使您可以使用 int/string/bool 直接调用该函数。是否发生了一些神秘的装箱/拆箱?不管怎样,是否有可能创建一个可以响应任何Action<T> 的委托?
【问题讨论】:
-
int必须被装箱才能传递给Action<object>,这并不神秘。 -
这是泛型逆变的限制,见stackoverflow.com/questions/12454794/…
-
public event Action OnNullAction = DefaultAction这不行。 -
我已将其作为副本关闭,但请参阅下面的答案以了解更多详细信息,以防您不清楚协变和逆变的概念。
标签: c# events parameters delegates action