将Action <string>转换为Action <object>

Dav*_*eis 3 c# delegates

我需要投一个Action<string>Action<object>.虽然这通常是类型不安全的,但在我的情况下,它总是会被一个字符串调用.我收到这个错误:

Unable to cast object of type 'System.Action1[System.String]' to type 'System.Action1[System.Object]'.

有线索吗?反思是公平的游戏.将一个代表包装到另一个代表中则不然.

更新:我创建了一个新的问题,为属性setter或getter创建一个高性能的开放委托,更好地解释我的问题,并使用我想改进的包装解决方案

Mat*_*hen 6

首先,它不安全.可以接受任何字符串的东西不能(必然)接受任何对象.想想一个示例方法:

void method(String s)
{
  s.Trim();
}
Run Code Online (Sandbox Code Playgroud)

显然,如果s是没有的对象,这将失败Trim.

从技术上讲,这意味着Action在T上是逆变的.你可以指定Action<string>一个假设的Action<SubclassString>参考,但string不能被子类化.

确实,C#允许定期不安全的强制转换(例如object本身string),冒险的风险InvalidCastException.但是,他们选择不为不安全的委托演员表实现基础设施.

编辑:我不知道没有包装器的方法.

  • @David,当我回答这个问题时,它说,"我需要将一个`Action <string>`强制转换为`Action <object>`.理所当然它应该是可行的"并且我解释了为什么这是错误的.即使是现在,问题的标题也不清楚. (2认同)