SORU
17 Aralık 2010, Cuma


Ne kadar boş bir dize doğru mu?

true dize türü olmadığından, nasıl null true bir dize mi ?

string s = true;  //Cannot implicitly convert type 'bool' to 'string'   
bool b = null   true; //Cannot implicitly convert type 'string' to 'bool'

Bunun arkasındaki neden nedir?

CEVAP
17 Aralık 2010, Cuma


Bu görünebilir olarak, sadece C kuralları takip ediyor tuhaf# dil spec.

Bölüm 7.3.4:

Form x op overloadable ikili bir operatör olduğu op y, bir operasyon türü x ifadesi X ve y aşağıdaki gibidir: türü Y ifadesi, işlenir

  • Aday kümesi kullanıcı tanımlı operatörler X tarafından sağlanan ve operasyon operatör için Y op(x, y) belirlenir. Set aday adayı operatörler operatörler X ve Y, her bir tespit sağladığı §7.3.5 kurallarını kullanarak sağlanan Birliği oluşur. Eğer X ve Y aynı tür, ya da eğer X ve Y ortak bir temel türünden türetilen, paylaşılan adayı operatörleri sadece Birleşik kümesi içinde bir kez meydana gelir.
  • Eğer aday kümesi tanımlı kullanıcı operatörler boş ise, o zaman bu operasyon için aday operatörleri tarafından belirlenir. Aksi takdirde, önceden tanımlanmış bir ikili operatör uygulamaları, kaldırdı formları da dahil olmak üzere, bu işlem için aday operatörler kümesi haline op. Belirli bir operatör, Önceden Tanımlı Uygulamalar operatörü (§7.12 ile §7.8) olarak tarif edilir.
  • Aşırı çözüm kuralları §7.5.3 uygulanma set aday operatörleri seçmek için en iyi operatör ile ilgili tartışma listesi (x, y), ve bu operatör olur sonucu aşırı çözümleme işlemi. Eğer aşırı çözünürlük en iyi tek bir operatör seçmek için başarısız olursa, bağlama zamanı hatası oluşur.

Hadi bu da doğru yürüyelim.

X eğer bu şekilde düşünmek istiyorsanız boş yazın buraya - ya da bir tür değil. Herhangi bir aday sağlamak değil. Y kullanıcı tanımlı herhangi bir operatörleri sağlamaz bool,. İlk adım kullanıcı tanımlı operatörler bulur.

Derleyici o zaman ikinci madde imi noktasını, önceden tanımlanmış bir ikili operatör uygulamaları ve kaldırdı şekillerine bakarak hareket eder. Bu spec bölüm 7.8.4 liste.

Eğer bu önceden operatörleri aracılığıyla bakarsanız,sadeceuygulanabilir bir string operator (string x, object y). Yani aday kümesi, tek bir giriş vardır. Bu son madde işareti noktası çok basit yapar... aşırı çözümleme bu operatör, genel bir ifade veren alır string yazın.

İlginç olan bir nokta ise bu kullanıcı-tanımlı operatörler atıfta çeşit mevcut diğer ise orada bile ortaya çıkar. Örneğin:

// Foo defined Foo operator (Foo foo, bool b)
Foo f = null;
Foo g = f   true;

Sorun değil, ama derleyici Foo bakmak için bilmiyor, çünkü boş bir edebi için kullanılan değil. Sadece önceden tanımlanmış bir operatör açıkça spec listelenen çünkü string düşünmeye bilir. (Aslındadeğilbir operatör string türüne...1Bu derleme başarısız olacağı anlamına gelir:

// Error: Cannot implicitly convert type 'string' to 'Foo'
Foo f = null   true;

Diğer ikinci işlenen bazı türleri diğer operatörler, elbette kullanacaktır:

var x = null   0; // x is Nullable<int>
var y = null   0L; // y is Nullable<long>
var z = null   DayOfWeek.Sunday; // z is Nullable<DayOfWeek>

1Merak ediyor olabilirsiniznedendize bir operatör yok. Makul bir soru, ve ben sadecetahmincevap, ama bu ifade göz önünde bulundurun:

string x = a   b   c   d;

*Eğer 20* C özel kasa olsaydı# derleyicisi, bu kadar etkili olacağını:

string tmp0 = (a   b);
string tmp1 = tmp0   c;
string x = tmp1   d;

Bu iki gereksiz Ara dizeleri oluşturdu. Derleyici içinde özel bir destek var, çünkü ancakaslındayukarıdaki gibi derleyebilir:

string x = string.Concat(a, b, c, d);

tam olarak doğru uzunluğu sadece tek bir dize, tam bir kez tüm verileri kopyalama yaratabilir. Güzel.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Droid Life

    Droid Life

    17 Kasım 2009
  • Kupa World

    Kupa World

    1 EYLÜL 2011
  • Palmundo Ec

    Palmundo Ec

    11 HAZİRAN 2009