我想知道 c# .net 中的类型转换,我有以下代码行。

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.

所以我想知道为什么 string s = i and string s = (string)i 不起作用,使用有什么区别 (string)i, i.ToString(), and Convert.ToString(i).

有帮助吗?

解决方案

当涉及到拳击和拆箱,种类必须明确和隐含的铸造。因此,在某些情况下,这是很容易的运行时间以允许对隐性转换之间的两个支持类型,说Int32一倍。然而,没有任何隐含或明确之间的转换一个整数和一串,因为很显然,一串不是一个整数,(尽管事实上,一串可以包含字用整数)。

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion

这是哪里 Convert 来玩。 Convert 包含用于支持试图转换成已知的原语(和类型的支持 IConvertable)到另一个。所以, ToStringConvert.ToString 将是首选方法(ToString和转换。ToString几乎是同义词,除了ToString给你一些格式的选择)。

其他提示

出色地, stringobject - 它们都是引用类型。然而, object 是所有 .NET 类型的根类型。

当您使用如下语法时 (string)i, ,您正在尝试在类型之间使用显式转换。但这种转换类型需要 string 类来了解所有可能的参数类型。

所以我们有 .ToString() 方法,可以在任何类中重写,其返回值用作任何对象的字符串表示。

string s= i和string s=(字符串)我不起作用

因为我不是一个字符串,而键入铸造是类型的展示,而不是转换。只有在包含字符串或字符串的子类(字符串不可能的子类时,它只能有效(但可能是其他类)。

使用(字符串)i,i.tostring()和convert.tostring(i)的差异是什么。

  • (string)i:将i转换为字符串,必须可分配。

  • i.tostring():调用toSstring方法,它是system.Object上的DefiSt.Object,因此可在所有类和结构上提供 - 但如果没有覆盖,则返回没有明智的内容。

  • convert.tostring(i):将i COONVERT到一个字符串。这包括调用一个转换器,该转换器可能只是在这个罕见的情况下调用toString。

    最后,铸造不是遮阳性。for(String)i to工作我必须是一个字符串,而转换尝试使其成为一个字符串。

您可以在.NET中指定隐式和显式转换,字符串S= i失败的原因是没有内置的铸造操作,用于整数到字符串。

请参阅此 msdn文章关于进一步信息的铸造

string s= i 不起作用,因为类型不匹配,int 不会进入字符串。

string s=(string)i 不起作用,因为它无法假设要使用哪种类型转换(即哪个基数)

就像是 s = ""+i 另一方面,它会工作,因为它会假设以 10 为基数进行转换。

所以我想知道为什么 string s = istring s = (string)i 不起作用

简短的回答是,没有定义从 int 到 string 的隐式(上面的第一个示例)或显式的(上面的第二个示例)转换。答案稍长;创作结构体时 Int32 在 C# 中,没有对转换行为进行编程以使开发人员能够自动从 int 转换为 string

使用有什么区别 (string)i, i.ToString(), , 和 Convert.ToString(i)

好吧,第一个并不像你所说的那样工作,正如我上面解释的那样。第二个称为 ToString 结构体上的方法 Int32, ,它返回(顾名思义)对象的字符串表示形式。应该注意的是,这是一个全新的字符串,与原始值没有任何关系。第三个例子 Convert.ToString 将在幕后调用任何最合适的方法将传入的参数转换为字符串 - 最有可能只是调用 ToString 方法 - 与示例 2 几乎相同。

ToString()方法是通过对象类中的每个引用覆盖。字符串cals覆盖该方法并提供串值。

toString方法的默认实现返回对象类型的完全限定名称,如以下示例所示。

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object
.

此行为是通过不覆盖ToString方法的引用类型继承。

C# 中的类型转换仅适用于类继承。Object 是 C# 中所有类型的根,因此所有值都可以类型转换为它。

stringint 不共享相同的继承分支,因此不能直接从一个到另一个。

Convert.ToString() 是一种旨在将整数转换为字符串的方法 - 没有进行类型转换,它只是执行旨在将整数转换为字符串表示形式的方法。

i.ToString() 执行等效的功能 Convert.ToString(), , 除了那个 i.ToString() 具有重载,可以更灵活地以字符串格式表示数字。

最后一点,开发人员可以通过使用 public static explicit operator 方法,允许开发人员将一个值转换为他们认为合适的另一个值。

首先要注意的是,每个类都来自对象。

铸造INT对象使用INT32。

铸造字符串到对象使用字符串。

没有从整数到字符串的隐式投射,因为它们位于类层次结构的不同部分 - 一个不以任何方式与另一个方式相关。但是,因为串通常用于输出对象(因此,其所有子项)都具有方便的ToString()方法。 但是,GRONG是专门写入的,以便能够从一种类型转换为另一个类型,例如convert.tobool(x)可以解析为boolean的“true”或“false”,并且如图所示,它可以将整数转换为一个字符串 - 再次这真的是一种便利,可能只需在引擎盖下调用int32.tostring()。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top