【问题标题】:Casting works but can't convert whats the difference and why铸造工作,但不能转换有什么区别,为什么
【发布时间】:2019-06-04 11:41:35
【问题描述】:

下面的代码可以正常工作。

MyType convertedItem = (MyType)item;

但是我从

得到一个编译器错误
var convertedItem = item as MyType;

无法通过引用将类型“OtherType”转换为“MyType” 转换,装箱转换,拆箱转换,包装 转换,或空类型转换。

任何人都可以解释为什么会发生这种情况。显式转换工作正常,但 AS 甚至无法编译。

** 在这种情况下如何获得“AS”功能。也就是说,我需要做一个 trycast,并且不希望调用异常处理程序来完成它。 **

【问题讨论】:

  • 你的类型是结构体吗?
  • @nilsk 我知道如何转换我不知道的内容,而您的“重复”没有解释是什么时候 AS 不会工作,即使明确的演员可以..
  • as 不适用于struct
  • 您在发布此之前是否搜索过其他答案?我在这里找到了类似的东西:link

标签: c#


【解决方案1】:

as 不适用于任何结构。从逻辑上讲,我们可以理解这一点,因为默认情况下结构是不可为空的。通过欺骗和装箱结构来强制转换为对象的建议

【讨论】:

  • as object as mytype 总是返回 null 所以虽然它会编译结果是没有用的。
  • 当然,这只是一个额外的花絮,为什么它很傻。如果您不确定强制转换是否有效,最好的情况是包装在 try catch 中,但如果您无法转换,则由您自己知道该怎么做。
  • 不想要异常处理程序的开销加上我实际需要的是 IEnumerable.OfType(MyType) 所以它总是比简单的例子更混乱,但事实上它的结构是问题。
  • 公平地说,在幕后必须有一些额外的开销。我认为我们忘记了语言关键字总是按照与我们作为用户类似的规则发挥作用。因此,我认为猜测as 可能是try catch 中的显式转换并不难。我必须看看 corefx 才能确定
【解决方案2】:

例如,以下类型将给出CS0039

class MyType
{
}

class MyOtherType
{
}

MyOtherType item = new MyOtherType();
var convertedItem = item as MyType;

在上面的例子中,编译器已经确定给定参与转换的类型,不可能执行请求的转换。

这里提供转换运算符可以解决问题。

编辑:不建议使用强制转换为 Object 来解决此错误,因为它违背了类型系统的目的

【讨论】:

  • 转换为对象是一种作弊。如果它是继承树,则不允许我们将对象转换为外部对象,但是将其擦除为对象会消除该约束,因为所有内容都继承自对象。并不是说这是错的,我只是觉得大多数时候这打破了语言的一些规则和护栏。
  • 感谢您收到我的反馈。这在 SO 上并不总是很常见,我很感激。
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
相关资源
最近更新 更多