2010-03-26 43 views
6

如果我做一個空的測試類:C#編譯器在打印「顯式轉換」時的含義是什麼?

public class Foo 
{ 
} 

我嘗試用這種說法來編譯代碼:

Foo foo = "test"; 

然後我得到這個錯誤的預期:

不能隱將類型'字符串'轉換爲'ConsoleApplication1.Foo'

但是,如果我改變的Foo聲明從類接口,錯誤修改本(重點煤礦):

無法隱式轉換類型 「字符串」到「ConsoleApplication1.Foo」。 的顯式轉換存在(你 缺少強制轉換?)

這是什麼「顯式轉換」這是應該存在?

更新:這個問題比我最初想象的更微妙。要重現它,把這個代碼放在一個新的控制檯應用程序在Visual Studio 2008:

namespace ConsoleApplication1 
{ 
    class Foo 
    { 
    } 

    interface IFoo 
    { 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
     Foo b = "hello"; 
     } 
    } 
} 

Visual Studio將在此點自動顯示正確的錯誤(你構建代碼之前)。現在插入「I」將「Foo」變成「IFoo」並且等待幾秒鐘,而不用建造。 「顯式轉換」版本的錯誤現在將自動出現在錯誤輸出窗口和工具提示中,用於分配錯誤。

錯誤的錯誤然後再次消失,當您明確地點擊F6生成

+0

值得注意的是,顯示在錯誤列表不是輸出(建)窗口此錯誤。 – gingerbreadboy 2010-03-26 16:25:20

+0

我仍然沒有看到編輯後代碼的錯誤,您是否有任何加載項或特殊設置? – 2010-03-26 16:40:44

+1

你有什麼VS插件運行?我無法在VS2008 SP1,Win XP SP3 x32中重現此問題。在兩種情況下,我都會得到預期的錯誤。 FWIW,我也在運行ReSharper 5.0RC編輯:Ron擊敗了我! :) – 2010-03-26 16:46:55

回答

10

我無法重現報告的行爲。如果它確實重現,那就是一個錯誤。沒有從字符串到任何用戶定義的接口的顯式轉換。

請更新與您使用的編譯器的版本號和問題的小程序的問題,我會得到一個錯誤輸入到錯誤數據庫。

謝謝!

更新:顯然它不在命令行上重現,但據稱在VS2008中重現。

我無法在VS2010的RC版本中重現它,所以如果這實際上是VS2008中的一個錯誤,那麼它可能已被修復。不幸的是,我現在沒有安裝VS2008。

無論如何,如果您看到該診斷,那麼賠率非常好,它只是語義分析器中錯誤報告啓發式算法中的一個錯誤。顯然沒有從字符串到IFoo的明確轉換。

從任何未密封的類型到任何接口類型都有明確的轉換,因爲可能存在實現接口的派生類型。但字符串是密封的,所以錯誤應該是「不轉換」。

+0

我只是試圖在csc.exe的幾個版本的命令行上重現它,但我不能以這種方式重現它。我只在用visual studio 2008構建時纔會看到它。 – 2010-03-26 16:27:11

+0

更正,我只在我相信Visual Studio自動顯示的錯誤時纔會看到它。 – 2010-03-26 16:33:40

+0

我也可以確認我沒有在VS2010 RC中看到這個。 – 2010-03-26 16:52:33

0

無法重現此操作。 CS0029只有

無法隱式轉換類型 '型' 到 '類型'」

CS0266,但是,說

無法隱式轉換類型 '類型1' 到 '2型'。存在明確的轉換(您是否缺少演員?)

但與Foo是空的類/接口,這是不可能的,國際海事組織。

1

無恥地從MSDN - Compiler Error CS0266MSDN - explicit (C# Reference)中撕掉。

如果您的代碼嘗試轉換兩種不能隱式轉換的類型(例如在將基本類型指定爲缺少顯式轉換的派生類型中),則會發生此錯誤。

顯式關鍵字聲明瞭一個用戶定義的類型轉換操作符,該操作符必須通過強制轉換進行調用。

// Must be defined inside a class called Farenheit: 
public static explicit operator Celsius(Farenheit f) 
{ 
    return new Celsius((5.0f/9.0f)*(f.degrees-32)); 
} 

這種轉換操作符可以調用這樣的:例如,該運營商從一個名爲華氏一類叫做攝氏類轉換

Farenheit f = new Farenheit(100.0f); 
Celsius c = (Celsius)f; 
0

會出現此錯誤,如果你這樣寫:

class Foo:IFoo 
{ 
} 

interface IFoo 
{ 
} 

static void Main(string[] args) 
{ 
    IFoo i = new Foo(); 
    Foo f = i; // here this message would occur, since IFoo *can* Convert to Foo (Since Foo implements IFoo), but it must be casted explicitly 
} 
0

是的,有沒有明確的方式來轉換Foo和字符串。但是,如果您想使用該語法,則可以使用Foo foo = "Hello World"作爲簡寫。這是通過使用implicit運營商完成的,如此處所定義。

它允許您隱式執行這些類型的轉換(因此名稱)。

要獲得這種類型的門面來完成的,這裏是你如何做到這一點:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ImplicitOperatorTest 
{ 
    class Foo 
    { 
     private string foo; 

     public Foo(string foo) 
     { 
      this.foo = foo; 
     } 

     public static implicit operator string(Foo foo) 
     { 
      return foo; 
     } 

     public static implicit operator Foo(string foo) 
     { 
      return new Foo(foo); 
     } 
    } 

    interface IFoo 
    { 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Foo b = "hello"; 
     } 
    } 
} 
相關問題