什么是类型转换,这有什么用?它是如何工作的?
请提供示例教程,我找不到任何搜索Google的好文章。
答案 0 :(得分:62)
转换通常是告诉编译器虽然它只知道某个值是某种通用类型,但您知道它的实际上是更具体的类型。例如:
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
这涵盖了您感兴趣的所有内容吗?
答案 1 :(得分:4)
强制转换意味着创建对与您当前持有的引用类型不同的对象的引用。你可以进行向上转换或向下转换,每个都有不同的好处。
向上转型:
string greeting = "Hi Bob";
object o = greeting;
这将从更具体的引用(字符串)创建更通用的引用(对象)。也许你已经编写了可以处理任何对象的代码,例如:
Console.WriteLine("Type of o is " + o.GetType());
无论你设置什么对象,都不需要更改代码。
向下转换:
object o = "Hi Bob";
string greeting = (string)o;
在这里,您需要更具体的参考。你可能知道对象是一个字符串(你可以测试这个例子:
if (o is string)
{ do something }
现在,您可以将引用视为字符串而不是对象。例如。一个字符串有一个长度(但一个对象没有),所以你可以说:
Console.WriteLine("Length of string is " + greeting.length);
你不能用对象做什么。
答案 2 :(得分:2)
因为C#在编译时是静态类型的,所以在声明变量之后,它不能再次声明或用于存储另一种类型的值,除非该类型可转换为变量的类型
...
但是,您有时可能需要将值复制到另一种类型的变量或方法参数中。例如,您可能需要传递给其参数类型为double的方法的整数变量。或者您可能需要将类变量分配给接口类型的变量。这些类型的操作称为类型转换。在C#中,您可以执行以下类型的转换
答案 3 :(得分:0)
答案 4 :(得分:0)
此外,如果您要明确投射,则可以利用模式匹配。如果你有一个对象:
object aObject = "My string value";
您可以安全地将对象转换为一行中的字符串:
if (aObject is string aString)
{
Console.WriteLine("aString = " + aString)
// Output: "aString = My string value"
}
使用它,以及if 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);
}