【发布时间】:2010-11-23 07:02:46
【问题描述】:
什么是类型转换,它有什么用?它是如何工作的?
【问题讨论】:
-
我可以告诉你,我知道如何正确地表达你的问题,兄弟!
标签: c#
什么是类型转换,它有什么用?它是如何工作的?
【问题讨论】:
标签: c#
此外,如果您要显式转换,则可以利用模式匹配。如果你有一个对象:
object aObject = "My string value";
您可以安全地将对象转换为一行中的字符串:
if (aObject is string aString)
{
Console.WriteLine("aString = " + aString)
// Output: "aString = My string value"
}
使用它和反向 if 语句,您可以安全地转换类型,并在需要时提前失败:
public void Conversion(object objA, object objB)
{
// Fail out early if the objects provided are not the correct type, or are null
if (!(objA is string str) || !(objB is int num)) { return; }
// Now, you have `str` and `num` that are safely cast, non-null variables
// all while maintaining the same scope as your Conversion method
Console.WriteLine("str.Length is " + str.Length);
Console.WriteLine("num is " + num);
}
【讨论】:
强制转换意味着创建对与您当前持有的引用类型不同的对象的引用。您可以进行向上转换或向下转换,每种方法都有不同的好处。
向上转型:
string greeting = "Hi Bob";
object o = greeting;
这会从更具体的引用(字符串)创建更一般的引用(对象)。也许你写过可以处理任何对象的代码,像这样:
Console.WriteLine("Type of o is " + o.GetType());
无论您将 o 设置为什么对象,都不需要更改该代码。
向下转型:
object o = "Hi Bob";
string greeting = (string)o;
在这里您需要更具体的参考。您可能知道该对象是一个字符串(您可以对此进行测试,例如:
if (o is string)
{ do something }
现在您可以将引用视为字符串而不是对象。例如。字符串有长度(但对象没有),所以你可以说:
Console.WriteLine("Length of string is " + greeting.length);
你不能用一个对象来做。
【讨论】:
强制转换通常是告诉编译器虽然它只知道一个值是某种通用类型,但您知道它实际上是一种更具体的类型。例如:
object x = "hello";
...
// I know that x really refers to a string
string y = (string) x;
有多种转换运算符。 (typename) expression 表单可以做三种不同的事情:
int)XAttribute 转换为string)object 转换为string)所有这些都可能在执行时失败,在这种情况下会抛出异常。
另一方面,as 运算符从不抛出异常 - 相反,如果失败,转换的结果是 null:
object x = new object();
string y = x as string; // Now y is null because x isn't a string
可用于拆箱为可空值类型:
object x = 10; // Boxed int
float? y = x as float?; // Now y has a null value because x isn't a boxed float
还有隐式转换,例如从int 到long:
int x = 10;
long y = x; // Implicit conversion
这是否涵盖了您感兴趣的所有内容?
【讨论】:
float 类型之后的问号的作用。