2010-03-30 71 views

回答

8

第一个是普通的铸造,这是改变类的一个对象(更从技术上来说,这不是铸造,但类型转换)。 .NET确实允许一些转换(如intlong等),但是这个特定的转换是不允许的。我认为这是不被允许的原因是因为只有一小部分字符串可以实际转换为int,并且这样做的规则将非常麻烦。此外,这可能无法与国际化打好关系。

第二个是方法调用,它实际上分析一个整数的字符串表示,并从中构造一个int

+0

你能给出一些理由为什么(int)“84”不被允许?因为我有理由感兴趣,因为两者都做同样的工作,从字符串转换为int – 2010-03-30 09:28:22

+0

请参阅我的答案。 String类不会实现一个转换为Int32(或其他数据类型)的运算符。 – Webleeuw 2010-03-30 09:38:39

1

.NET框架中只允许某些原始类型转换。 (int)“string”不是其中之一。您需要使用转换类或包装类

Integer.Parse("string"); 
0

转换是专为一个类型转换为另一种的目的,并且不依赖于能够施展。

在铸造中,您只能投相关类型之间,和int和字符串是没有关系的。

Integer.Parse也许对你很感兴趣。

Martin。

3

那是因为Convert.ToInt32是一个方法调用接受字符串。

(int)是从一种类型到另一种明确的转换。字符串和Int32不是明确地也不是隐式地可转换的。

加入有关转换: 您可以创建自己的隐性和显性的转换,如:

class Foo { 
    bool b = (bool)new Blah(); 

    struct Blah { 
     public static explicit operator bool(Blah b) { 
      return true; 
     } 
    } 
} 

我已经把我的例子很简单(没用),但它应该做点晴只有在要转换的类或结构中存在运算符时,才可以进行简单的转换。否则,您将需要使用Convert类或IConvertible接口。

0

这是因为没有从字符串到int的显式转换。 Convert类不是通过转换而是通过转换来实现转换

+2

发表评论,如果你downvote请,它可以帮助每个人学习。 – 2010-03-30 09:50:46

0

转换就像假装一件事是另一件事。 可以成功地假装27L == 27m,或27L == (int)27,但假装"84"int会,如果有可能,导致3670068,不84

为什么?

由于"84"存储为两个Unicode字符'\x0038''\x0034'和,而不是值84Convert.ToInt32("84")"84"转换为(int)84

铸造4294967295U(注意,这是无符号)到int结果在-1

uint x = 4294967295U; //need to assign this to a variable as compile will error 
Console.WriteLine((int)x); //results in -1 
1
(int)"84" 

什么你试图有什么所谓的显式类型转换。显式转换仅适用于定义为兼容的类型或对象引用。请参见本为转换允许http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx

Convert.ToInt32("84") 

这种说法本身调用执行解析就像如果它不是由框架提供的我或你会写一个方法。它使用反射器并查看实现,上面的方法实际上是按照下面的方式实现的,所以它不仅仅是告诉编译器,你希望通过显式转换将该类型视为另一类型。

public static int ToInt32(string value) 
{ 
    if (value == null) 
    { 
     return 0; 
    } 
    return int.Parse(value, CultureInfo.CurrentCulture); 
}