Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-为什么将类型转换为对象会像这样工作?_C#_Oop_Type Conversion - Fatal编程技术网

C#-为什么将类型转换为对象会像这样工作?

C#-为什么将类型转换为对象会像这样工作?,c#,oop,type-conversion,C#,Oop,Type Conversion,我试图理解: Object obj = "string"; var type = obj.GetType(); // returns System.String 我知道这是一个成功的隐式转换,但我不明白为什么如果调用obj.GetType(),它会返回System.String,而不是System.Object 如果我想要一个字符串类型,我就不会给对象类型分配“string”。如果obj仍然是对象类型,则更为正确。有人能解释一下吗?您有一个字符串文本,它的类型是字符串。当您将其分配给obj变

我试图理解:

Object obj = "string";
var type = obj.GetType(); // returns System.String 
我知道这是一个成功的隐式转换,但我不明白为什么如果调用
obj.GetType()
,它会返回
System.String
,而不是
System.Object


如果我想要一个字符串类型,我就不会给
对象
类型分配“string”。如果
obj
仍然是
对象
类型,则更为正确。有人能解释一下吗?

您有一个
字符串
文本,它的类型是
字符串
。当您将其分配给
obj
变量,该变量是
对象
字符串
文本被隐式转换为
对象
,这是有效的,因为所有类类型都隐式继承自
对象

因此,您有一个
对象
,但
obj
所指对象的基本类型仍然是
字符串
。通过将其转换为
对象
,您只能使编译器将
对象
视为
对象
,而不是
字符串
。因此,例如,您不能使用
obj
调用在
string
类型上声明的方法


obj.GetType()
返回基础类型,而不是将对象转换为的类型。这就是为什么你得到的是
string
而不是
object
事实上,由于C语言中的所有东西都继承自
object
,所以所有东西都是一个对象。例如,
字符串
类型派生自对象(有关更多信息,请查看此项:)。这意味着,每个字符串都是一个对象,因此可以隐式地转换为一个对象。然而,它仍然是一个字符串-它只是作为一个对象处理

字符串实际上仍然保留在它的核心,仍然是一个字符串,即使您尝试将其强制转换为一个对象-这对于每个继承项都是相同的。例如,如果您有以下代码:

public class Class2 : Class1
{

}

public class Class1
{

}
然后在其他地方执行下面的代码(我使用了交互式)

结果仍然会得到
Class2

实际上,我认为这是不可能的——你可以一直假装它是另一种类型,我看不出有任何理由认为这是不够的。

因为这是一种引用转换。顾名思义,在引用转换中,唯一改变的是引用,也就是指向对象的变量

组成字符串文字的位不会改变,在
Object o=“string”
中唯一要做的事情就是创建一个变量
o
键入的
对象
,该变量指向
字符串
“string”
。变量
o
中存储的值正是
字符串
所在的内存地址:

鉴于:

var s = "Hello";
这些转换中的任何一种都是引用转换:

object o = s; //creates a new reference typed object pointing to "Hello".
IComparable<string> e = s; //creates a new reference tpyed...
为什么??因为
i
d
是两个不同的对象,所以构成整数和双精度的位是完全不同的。从
int
double
的隐式转换是用户定义的运算符:

int i = 1;
double d = i;
d.GetType() //returns Double.
class Bar
{
    public Bar(Foo f) { ... }
}

class Foo
{
    public static implicit operator Bar(Foo f) => new Bar(f);
}
public static implicit operator Object(Foo f) { ... } //compile time error. 
现在如果你这样做了:

var f = new Foo();
object o = f;
Bar b = f; //implicit user defined conversion from Foo to Bar
您将获得以下输出:

o.GetType() //Reference conversion: returns Foo
b.GetType() //User defined conversion: returns Bar
请注意,所有引用转换都是由编译器提供的,您不能将引用转换定义为用户定义的运算符:

int i = 1;
double d = i;
d.GetType() //returns Double.
class Bar
{
    public Bar(Foo f) { ... }
}

class Foo
{
    public static implicit operator Bar(Foo f) => new Bar(f);
}
public static implicit operator Object(Foo f) { ... } //compile time error. 
总之,有一个特殊的非身份保持转换,
GetType()
仍将返回原始对象的类型。你能告诉我是哪一个吗


另外,涉及值类型的引用转换是不可能的,因为值类型变量的值不是引用,而是值类型实例本身

GetType()
返回对象的运行时类型,从开始到结束始终为
string
。如果您想获取变量的类型,只需将鼠标悬停在它上面,然后写入
typeof(object)
(或任何您想要的内容)。此外,您可能还想继续阅读。
string
不是值类型。“当您将其分配给对象obj变量时,字符串文字将隐式转换为对象”。这不是真的,字符串文字没有转换成任何东西。参考文献是。