2011-06-21 21 views
5

Hata olduğuna inandığım bir şeyle karşılaşıyorum ve bunun bir sorun olarak mı yoksa bir sorun değil mi olduğunu merak ettim.VB.Net bu neden bir hata değil?

2008.

İzliyor Visual Studio içinde VB.Net derleyicisi derleme zaman Tip Yalnızca özellikleri okuma ile ilgili sorun sınıfı tanımlar ve derleme olmayacak küçük bir C# programı vardır. Ancak bu daha büyük bir mesele ... programı derlemek ve hiçbir istisna ile çalıştırır ise VB.Net yılında

public interface ITest 
{ 
    bool PrivateBool { get; } 
} 

public class TestClass : ITest 
{ 
    bool privateBool = false; 

    public bool PrivateBool 
    { 
     get 
     { 
      return privateBool; 
     } 
    } 

    bool publicBool = false; 

    public bool PublicBool 
    { 
     get { return publicBool; } 
     set { publicBool = value; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestClass tc = new TestClass(); 
     //Compile Error 
     //tc.PrivateBool = false; 

     //Compile Error 
     //Action act = new Action(delegate() 
     //{ 
     // tc.PrivateBool = false; 
     //}); 

     //Action<TestClass> test = new Action<TestClass>(delegate(TestClass tcc) 
     //{ 
     // tcc.PrivateBool = false;    
     //}); 

     //Compile Time Error 
     //Action<TestClass> test = new Action<TestClass>(tz=> tz.PrivateBool = false); 

     //Compile Time Error 
     //Action test = new Action(tc.PrivateBool = false); 
    } 
} 

(Ve salt oku özelliği Delegesi ayarlı çünkü IMHO derleme değil de doğrudur). Ama özellik ayarlanmadı. Bu, çalışma zamanında hata ayıklayıcısını yakalamak için bir kabus oldu ve derleyicinin derleme sırasında yalnızca CSharp derleyicisinin sizi uyarması gibi hazır bir mülke atadığımızı düşünmüş olmalıyız.

Module Module1 

    Sub Main() 

     Dim tc As New TestClass() 
     Dim setP = New Action(Of TestClass)(Function(d As TestClass) _ 
               d.PrivateBool = False _ 
               ) 

     setP.Invoke(tc) 


    End Sub 

End Module 

Bunun mantıklı ve mantıklı olduğunu kimse anlatabilir mi?

Birisi, derleyicinin görevinin, parametre türünü temsilci ile inceleyerek yerine getirileceğini ve temsilci, bir Yöntem Gövdesi veya İşlev Gövdesi ayrıştırılırken gereken şekilde bu parametreyi kabul etmek üzere yazıldığını varsayar.

Derlemem bunun için, bu özellik bir yöntem içinde değil, temsilci tarafından ayarlanmaya çalışıldığında, derleyici DOES bir hata atar. Delegeler, bir Yöntem ile aynı şekilde ayrıştırılmalıdır.

C# derleyicisi kendini genişletiyor mu? Bence değil. Benim deneyimim, bunun, etc.net derleyicisindeki bir hata olması ve IDE'ye bir yama ile düzeltilmesi gerektiğidir.

Son olarak, en azından Invoke olduğunda ne olur?

Temsilci, otomatik olarak özelliği otomatik olarak ayarlamak için yansıma kullanmaz; dolayısıyla CLR'nin salt okunur niteleyiciyi gördüğünü ve NOOP'nin çalıştırıldığını varsayırım. Bu aslında ne oluşur veya davranış tanımsız mı?

Zaman ayırdığınız için teşekkür ederiz!

cevap

5

VB.NET 2008'de lambdas ifadesi mevcut değil. Bütün lambdaslar fonksiyonlardır. Bir değer döndürürler, bir eylem gerçekleştirmezler.

VB lambda, d.PrivateBool ve False numaralarını karşılaştırır ve karşılaştırmanın sonucunu döndürür.

Bu bir hata ve tasarım gereği değildir. Bu nedenle, VB.NET 2008'in lambdalarının bir Action numarasına verilmesinden kaçınılması tavsiye edilir, bu hazırlıksız bir kişi için oldukça kafa karıştırıcıdır.

Tablosu lambda'lar Yani derleyici bir değerlendirme veya karşılaştırma atama oluyor ve olmadığını çıkarım olduğu

+0

VB.NET 2010. ortaya çıktı? Bir Void veya Sub'a eşit olduğu için eylemin dönüş değeri yoksa, o zaman boole nasıl geri dönebilir? – Jay

+0

@Jay Evet, derleyici bunun bir karşılaştırma olduğunu biliyor. Dönüş değeri göz ardı edilir, çünkü bir 'Eylem'. Bir alttan bir işlevi çağırmak ve geri dönüş değerini görmezden gelmek çok güzel, birçok kez lambda kodunda görmediniz. – GSerg