Null atarsanız, Convert.ToString (null) neden farklı bir değer döndürür?


116
Convert.ToString(null)

İadeler

null

Beklediğim gibi.

Fakat

Convert.ToString(null as object)

İadeler

""

Bunlar neden farklı?

Yanıtlar:


143

Burada ToStringdevreye giren 2 aşırı yükleme var

Convert.ToString(object o);
Convert.ToString(string s);

C # derleyicisi, esasen girdi ile çalışacak en spesifik aşırı yüklemeyi seçmeye çalışır. Bir nulldeğer, herhangi bir başvuru tipi için dönüştürülebilir. Bu durumda stringdaha spesifiktir objectve dolayısıyla kazanan olarak seçilecektir.

Gelen null as objectsiz ifadenin türünü katılaşmış ettik object. Bu, artık stringaşırı yük ile uyumlu olmadığı ve derleyicinin, objectkalan tek uyumlu olan aşırı yüklemeyi seçtiği anlamına gelir .

Bu bağ bozmanın nasıl çalıştığına dair gerçekten tüylü ayrıntılar, C # dil spesifikasyonunun 7.4.3 bölümünde ele alınmıştır.


15
Tamam. Yani diğerinin yerine bir aşırı yüklemeyi kullanıyor. Mantıklı. Ancak her iki aşırı yükleme de aynı şeyi döndürmemeli mi? +1 btw.
John MacIntyre

2
@JohnMacIntyre - Bu, derleyiciye değil geliştirme ekibine bağlıdır.
JonH

8
@JohnMacIntyre Uygulamasına bakarsanız, aslında takip etmesi daha zor bir yoldan geçerken , Convert.ToString(string)bunun sadece bir kimlik işlevi olduğunu görürseniz Convert.ToString(object). Bir bakışta aynı şekilde dönmeleri gerektiğini kabul ediyorum ama BCL'nin dönüştürülebilir katmanı benim çok bilgili olduğum bir şey değil ve bu fark için iyi bir neden olabilir (yine de şüpheliyim)
JaredPar

Buraya boş bir nesneyi boş dizeye nasıl dönüştüreceğimi aramak için geldim. Diğer arayanlar için cevap (string)null, ya da nesnenin adı o ise, o zaman(string)o
rayzinnz

65

JaredPar'ın mükemmel aşırı yük çözümü cevabının ardından - "neden Convert.ToString(string)boş Convert.ToString(object)dönüp geri dönüyor string.Empty" sorusu kalıyor ?

Ve bu cevabı ... çünkü dokümanlar demek bu yüzden :

Convert.ToString (string), "belirtilen dize örneğini döndürür; gerçek dönüştürme gerçekleştirilmez."

Convert.ToString (nesne), "değerin dize gösterimini veya değer null ise String.Empty" döndürür.

DÜZENLEME: Bunun "spesifikasyondaki bir hata", "çok kötü API tasarımı", "neden böyle belirtilmiş" vb. Olup olmadığına gelince - neden göremediğime dair bazı gerekçelere göz atacağım büyük bir mesele.

  1. System.Converther temel türü kendisine dönüştürmek için yöntemler vardır . Bu garip - çünkü dönüştürme gerekmediği veya mümkün olmadığı için yöntemler sadece parametreyi döndürüyor. Convert.ToString(string)aynı şekilde davranır. Bunların kod oluşturma senaryoları için burada olduğunu varsayıyorum.
  2. Convert.ToString(object)geçildiğinde 3 seçeneği vardır null. Atın, boş döndür veya dize döndür. Fırlatma kötü olur - iki katına çıkarsak, bunların üretilen kod için kullanıldığı varsayılır. Boş değer döndürmek, arayanınızın boş bir kontrol yapmasını gerektirir - yine, oluşturulan kodda mükemmel bir seçim değildir. String.Empty makul bir seçim gibi görünüyor. System.ConvertDeğer türleriyle yapılan anlaşmaların geri kalanı - varsayılan bir değere sahip.
  3. Null döndürmenin daha "doğru" olup olmadığı tartışmalı, ancak string.Empty kesinlikle daha kullanışlı. Değiştirmek Convert.ToString(string), "gerçek dönüştürme yok" kuralını ihlal etmek anlamına gelir. Yana System.Convertstatik yarar sınıftır, her yöntemin mantıklı kendi olarak tedavi edilebilir. Bu davranışın "şaşırtıcı" olması gereken çok az gerçek dünya senaryosu vardır, bu nedenle kullanılabilirliğin (olası) doğruluğu kazanmasına izin verin.

Bunun spesifikasyondaki bir hata olduğunu söylemek doğru mu?
John MacIntyre

3
bu, neden böyle olduğu yanıtını vermiyor. Bunun gibi davrandığını söylemek, çünkü böyle davrandığı belgelenmek totolojiktir.
CodesInChaos

2
@JohnMacIntyre IMO çok kötü API tasarımı olduğunu söylemek doğru olur.
CodesInChaos

7
@CodeInChaos - BCL geliştirildikten sonra belgelerin gözlemlenebilir davranışa dayalı olarak yazıldığını varsaymadığınız sürece bir totoloji değildir. Bence bu garip bir varsayım olurdu. IOW, "bu şekilde davrandığı belgelenmemiş", "bu şekilde davranacağı belgelenmiştir " - yani, " bu şekilde davranacağı belirtilmiştir ".
Mark Brackett

8
Yalnızca soruyu "neden böyle davranacağı belirtildi" sorusuna kaydırır
CodesInChaos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.