2009-08-09 15 views
5
Burada sadece Yığın taşması birinin soruyu cevaplamak için karıştırmasını

, benim Visual Studio (2008) içinden bir statik doğrulama uyarısı fark:.NET kod sözleşmeleri: bundan daha basit olabilir mi?

string[] source = { "1", "A", "B" }; 
var sourceObjects = Array.ConvertAll(source, c => new Source(c)).ToArray(); 

ben mesaj alıyorum kanıtlanmamış kaynağı gerektirir! = sıfır. Bana öyle görünüyor ki, durum böyle değil. Bu sadece bir örnektir. Diğer tarafta, oldukça çekici bazı şeyler oldukça iyi çalışıyor gibi görünüyor.

1.2.20518.12 sürümünde (18 Mayıs) kullanıyorum. Kod sözleşmelerini çok ilginç buluyorum, ancak başkalarının böyle davaları oldu mu? Mevcut uygulamanın pratikte kullanılabilir olduğunu düşünüyor musunuz, yoksa bu aşamada tamamen akademik düşünür müsün?

Bunun bir topluluk wiki yaptık ama bazı görüşler :) yukarı iki çağrıları bölünmüş eğer

cevap

16

Daha mantıklı duymak istiyorum: Bu işaret Şimdi

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
var sourceObjects = tmp.ToArray(); 

numaralı soruna sorun olarak satırına. Başka bir deyişle, Array.ConvertAll numaralı çağrı, kaynağın boş olmadığını bilir, ancak ToArray() numaralı çağrı, tmp'un boş olmadığını bilmez. Eğer değişken bir şey tamamen farklı aramıştı olsa bile ilk parametresinde bahsediyordur olarak, hata yine source kullanırsınız -

(Kişisel örneği nedeniyle kaynak kodunda adının source kullanımına da biraz kafa karıştırıcı Enumerable.ToArray.)

Temel olarak, bunun, Array.ConvertAll uygun olmayan sıfır olmayan bir postcondition aldığında çalışacağına inanıyorum. O zamana kadar bu hile olacaktır:

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
Contract.Assume(tmp != null); 
var sourceObjects = tmp.ToArray(); 

Ben bu tür şeyleri sinir bozucu katılıyorum ama MS BCL içine daha sözleşmeleri ekler olarak hızla artıracak eminim. Statik denetçinin kendisi ile ilgili değil bir sorun olduğuna dikkat etmek önemlidir.

(Aslında, Array.ConvertAll bir ön şart olarak yok ya - Yukarıdaki ikinci kod parçacığı içinde null source değişkeni ayarlarsanız, hala şikayet olmaz.)

+1

zaten sözleşmeleri bölüm yazma yoluyla? :) –

+1

Neredeyse, evet :) Bundan çok etkilendim, dürüst olmak gerekirse. –

+1

Henüz bu kadar iç çalışmalara dalmadım, ancak temel sınıf kütüphanesinin mevcut sürümlerinde halihazırda mevcut olan yöntemler için önkoşullar ve sonlandırmalar nasıl tanımlanıyor? Sanırım genelde ccrewrite, dağıtımda ne üretir? – Thorarin

İlgili konular