C# 为什么会有";作为「;运算符必须被传递一个引用或可为null的类型?

C# 为什么会有";作为「;运算符必须被传递一个引用或可为null的类型?,c#,type-conversion,C#,Type Conversion,所以我知道C#中的as运算符必须传递一个引用或可为null的类型,因为它可以返回null,我不明白的是-为什么 返回null应该与传递给它的参数分开,因为我不知道它的内部工作原理,我只能利用我对普通方法的知识,通常情况下,我返回的与传递的参数无关 换句话说,我将想象为操作符,类似于以下伪代码: private object as(object arg1, object arg2) { if (arg1 can be cast to arg2) return (arg2)a

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

返回null应该与传递给它的参数分开,因为我不知道它的内部工作原理,我只能利用我对普通方法的知识,通常情况下,我返回的与传递的参数无关

换句话说,我将
想象为
操作符,类似于以下伪代码:

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

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

想象一下,您想借助
as将某个对象强制转换为
int

int number = object as int;

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

您的
as
的“伪代码版本”实际上并不像
as
运算符那样做,所以它实际上不是一个有效的示例。您的
as
运算符返回
对象
,但实际的
as
运算符返回为表达式指定的任何类型。如果该类型是一个值类型,当然不能有
null
值,那么它是如何工作的呢?无论如何,你的问题已经被问过并回答过了……请看标记为重复的。@PeterDuniho,哦,那么它实际上看起来是
private T as(object arg1,T arg2)
?但是
object o=object as int
失败了,因为int不是引用类型,我在问为什么会这样。表达式
object as int
毫无意义<代码>对象
是一种类型,而不是变量。但假设您有
对象,对象为object=3。此时,变量intObject引用一个表示整数3的装箱整数。因此
inti=(int)intObject:
将导致变量
i
包含值3。但是,如果您尝试使用
as
intObject as int
执行强制转换,它看起来像强制转换,但会导致类型为
int
的表达式。
as
关键字的失败行为是在无法转换时返回
null
。但是,
null
对于
int
@J.Doe
object o=x等值类型不是有效值,因为int
首先将x转换为
int
,然后将其转换为
object
。基本上,
xasint
部分不知道您想要获取它的结果并进行另一次转换。在这种情况下,你为什么不把对象o=x作为对象呢?当您最终想要转换为
对象时,为什么要尝试转换为
int
@juharr,哦,那么方法签名实际上看起来是某种
私有的T-as(对象arg1,T-arg2)
?@J.Doe更像
公共的TOut-as(TIn-arg)where-TOut:class