【问题标题】:Why the "as" operator must be passed a reference or nullable type? [duplicate]为什么“as”运算符必须传递一个引用或可为空的类型? [复制]
【发布时间】:2019-03-16 21:47:16
【问题描述】:

所以我知道 C# 中的as 运算符必须传递一个引用或可为空的类型,因为它可以返回 null,我不明白的是 - 为什么?

返回 null 应该与传递给它的参数分开,因为我不知道它的内部工作原理我只能利用我对普通方法的了解,这就是我返回的东西通常什么都没有与我传递的参数有关。

换句话说,我认为as 运算符类似于以下伪代码:

private object as(object arg1, object arg2)
{
    if (arg1 can be cast to arg2)
        return (arg2)arg1;
    else
        return null;
}

那么,传递的参数是引用类型还是值类型又有什么关系呢?

【问题讨论】:

  • 你的as 的“伪代码版本”实际上并没有像as 运算符那样做,所以它实际上不是一个有效的例子。您的 as 运算符返回 object,但 actual as 运算符返回为表达式指定的任何类型。如果该类型是值类型,当然不能有null 值,那它怎么会起作用?无论如何,您的问题已经被提出并回答了......请参阅标记的重复项。
  • @PeterDuniho,哦,实际上它的样子是private T as(object arg1, T arg2)

标签: c# type-conversion


【解决方案1】:

假设您想在as 的帮助下将某个对象投射到int

int number = object as int;

如果对象是int,则转换成功,结果存储到int number。如果对象不是int,则转换返回null,并且它可以存储在不可为空类型的变量中。这就是为什么编译器不允许将as 与不可为空的类型一起使用。

【讨论】:

  • object o = object as int 失败,因为 int 不是引用类型,我在问为什么会这样。
  • 表达式object as int 没有意义; object 是一种类型,而不是变量。但假设你有object intObject =3;。此时,变量 intObject 引用了一个表示整数 3 的 装箱整数。因此,int i = (int)intObject: 将导致变量 i 包含值 3。但是,如果您尝试执行使用asintObject as int 进行强制转换,它看起来像一个强制转换,但是它会产生int 类型的表达式。 as 关键字的失败行为是在无法进行转换时返回null。但是,null 不是 int 等值类型的有效值。
  • @J.Doe object o = x as int 首先将 x 转换为 int,然后将其转换为 object。基本上x as int 部分不知道您想要获取它的结果并进行另一个演员。真的在那种情况下,你为什么不直接做object o = x as object?当您最终想要转换为 object 时,为什么还要尝试转换为 int
  • @juharr,哦,所以方法签名实际上看起来像private T as(object arg1, T arg2)
  • @J.Doe 更像public TOut as<TIn, TOut>(TIn arg) where TOut : class
猜你喜欢
  • 2011-03-07
  • 2014-08-07
  • 2014-07-02
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2010-10-25
相关资源
最近更新 更多