Convert.ToString(null)
İadeler
null
Beklediğim gibi.
Fakat
Convert.ToString(null as object)
İadeler
""
Bunlar neden farklı?
Convert.ToString(null)
İadeler
null
Beklediğim gibi.
Fakat
Convert.ToString(null as object)
İadeler
""
Bunlar neden farklı?
Yanıtlar:
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.
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)
(string)null, ya da nesnenin adı o ise, o zaman(string)o
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.
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.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.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.