2015-11-06 25 views
1

比較此C#(fiddle爲什麼VB編譯器在C#中無法捕獲到接口類型的無效隱式轉換?

public class Program 
{ 
    public static void Main() 
    { 
     IFoo test; 
     test = new Impl(); 
     test = new NoImpl();     
    } 
} 
public interface IFoo {} 
public class NoImpl {} 
public class Impl : IFoo {} 

此VB(fiddle)。

Public Module Module1 
    Public Sub Main() 
     Dim test as IFoo 
     test = new Impl() 
     test = new NoImpl() 
    End Sub 
End Module 

Public Interface IFoo 
End Interface 

Public Class NoImpl 
End Class 

Public Class Impl 
    Implements IFoo 
End Class 

在C#中,編譯器將NoImpl的隱式強制轉換爲錯誤。在VB中,代碼編譯但在運行時失敗。

這兩種語言/編譯器之間有什麼特別的區別?

可能與Why no compiler error when I cast a class to an interface it doesn't implement?

+0

是否在VB編譯器中嚴格打開選項? –

+0

@RonBeyer不,它不是;只需將它添加到[小提琴](https://dotnetfiddle.net/fxgMK3),它不再編譯 – Sehnsucht

+4

當我是一個VB程序員(時代.NET 1.1)時,我宗教上確保選項嚴格和選項明確被打開,否則這些類型的錯誤將永遠不會彈出,直到運行時。 –

回答

6

this pageOption Strict

默認情況下,Visual Basic .NET或Visual Basic編譯器不強制遵循嚴格的數據類型。 ...在Visual Basic .NET中,您通常可以將任何數據類型隱式轉換爲任何其他數據類型

因此,這裏發生的是VB編譯器的「鬆散」本質,讓它在運行時會失敗。 C#對於類型轉換並不那麼寬鬆,這就是爲什麼它總是給出一個編譯器錯誤,而VB不會。使用Option Strict有助於在編譯時而不是運行時識別這些錯誤。

如果沒有使用Option Strict,VB將允許任何轉換/強制轉換,而不會出現任何類型的打嗝,但縮小轉換次數,失去轉換精度並且完全無效將會導致運行時錯誤。發佈在頂部的鏈接提供了關於哪些類型轉化被認爲正在擴大的信息。

+1

可以說默認情況下它不是'Strict On'是一個「恥辱」,但它對於設計團隊保持向後兼容性始終是至關重要的,因此我們被這種「遺留」卡住 – Sehnsucht

+0

我同意它可以追溯到舊的VB程序,其中「程序員」會做很多美妙的事情,例如Dim x as int,然後是'x =「10」',編譯器很高興接受。通常這些令人費解的冗長程序被交給了更有經驗的開發人員,並且嚴格打開了選項,編譯器只會爆炸,所以更容易離開它。 –

+0

而具體的一個是(部分)爲什麼VB.Net的聲譽如此糟糕;我們選擇了從VB6平穩過渡(也許更多的是經濟/營銷決策而不是設計),現在它付出了沉重的代價;一個C#沒有的問題。 – Sehnsucht

相關問題