2013-03-01 181 views
2

我有一个关于转换方法“.ToString()”的一般问题。 起初,我用这个语句转换:“Convert.ToString(Nullable <int>)”和“Nullable <int> .ToString()”之间的区别?

Nullable<int> SomeProperty; 
string test = SomeProperty.ToString(); 

到这里是没有问题的,但之后,我想“CultureInfo.InvariantCulture”添加到ToString()方法。它不起作用,因为Nullable的.ToString()没有参数。为什么Resharper建议将CultureInfo信息插入我?

之后,我尝试了另一种方式,并使用此声明:

Nullable<int> SomeProperty; 
string test = Convert.ToString(SomeProperty, CultureInfo.InvariantCulture); 

此语句工作正常,但现在我想明白了第一和第二条语句之间的差异的技术?

回答

4

Convert.ToString Method (Object, IFormatProvider)

如果该值参数实现IConvertible接口,所述 方法调用的值的IConvertible.ToString(的IFormatProvider)实现 。否则,如果value参数实现了IFormattable接口,则该方法将调用其IFormattable.ToString(String,IFormatProvider)实现的 。如果 值没有实现接口,则该方法调用参数的ToString()方法的值 。

Nullable<int>看到像标准int,而当Convert.ToString与格式提供被称为IFormattable.ToString(String, IFormatProvider)被激发。

证明:内GetFormat

class MyFormatProvider : IFormatProvider 
{ 

    public object GetFormat(Type formatType) 
    { 
     return "G"; 
    } 
} 

static void Main(string[] args) 
{ 
    Nullable<int> SomeProperty = 1000000; 
    Console.WriteLine(SomeProperty.ToString()); 
    Console.WriteLine(Convert.ToString(SomeProperty)); 
    Console.WriteLine(Convert.ToString(SomeProperty, new MyFormatProvider())); 
} 

认沽断点,它会被执行Main最后一个时被打。

+1

['int'实现'IFormattable'](http://msdn.microsoft.com/en-us/library/system.int32.aspx),所以这是错误的,这不会调用'ToString( )',这将会调用'ToString(IFormatProvider)'。 – hvd 2013-03-01 07:38:17

+0

但它不是关于'int',它关于'可空的' – MarcinJuraszek 2013-03-01 07:38:47

+0

盒装的'可空'是一个盒装的'int'。 'Convert.ToString'不能说它最初来自可空类型。 – hvd 2013-03-01 07:39:16

相关问题