2008-10-07 16 views
1

嘗試使用可爲XML解析提供位置參考的excpetion類,發現了一個有趣的行爲 - 編譯器無法在使用接口的重載和需要System.Exception的重載之間進行選擇當我試圖通過XmlReader作爲參數。編譯器無法選擇接口和異常之間的過載

Detais是以下幾點:

//exception overloads: 
public FilterXmlParseException(string message, Exception innerException) 
     : base(message, innerException) { } 
public FilterXmlParseException(string message, IXmlLineInfo lineInfo) {...} 

//Usage: 
XmlReader reader = ... 
IXmlLineInfo lineinfo = (IXmlLineInfo)reader; 

//fails 
throw new FilterXmlParseException("<Filter> element expected", reader); 

//ok 
throw new FilterXmlParseException("<Filter> element expected", lineinfo); 

而且因爲它不能正確的選擇,爲什麼overload.But失敗?我們看到的XmlReader支持一個接口,它不是從System.Exception

回答

1

行繼承:

//fails 
throw new FilterXmlParseException("<Filter> element expected", reader); 

因爲XMLReader不能執行IXmlLineInfo。我不確定你的演員是否有效,但演員不是靜態的。如果它真的有效,那是因爲具體類(從XmlReader繼承)實現了這個接口,但編譯器無法知道它。

0

它無法爲XmlReader調用選擇過載,因爲既不是過載也是可以接受的。 XmlReader不會從Exception繼承,所以第一次調用無效。 XmlReader也沒有實現IXmlLineInfo。

它在第二種情況下工作的原因是你迫使演員。不過,我相信如果你真的要運行這個代碼,它會拋出一個InvalidCastException異常。閱讀關於XmlReader的文檔,你會發現它實現的唯一接口是IDispoable。

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx

0

你忽略了關鍵部分:

XmlReader reader = XmlTextReader.Create(sreader, readerSettings); 

你叫其返回的方法XmlTextReader,但變量的類型是XmlReader。因爲XmlTextReader支持該接口,即使XmlReader不適用。

雖然編譯時發生過載,但是因爲XmlReader不支持IXmlLineInfo,所以它不能匹配簽名。

您可以通過書面形式解決這個問題:

XmlTextReader reader = (XmlTextReader)XmlTextReader.Create(sreader, readerSettings); 

注意,你需要投因爲Create返回類型是XmlReader,即使它實際上返回一個XmlTextReader

+0

沒有這麼簡單 真的,我用XmlTextReader.Create(sreader,readerSettings) 並返回我的XmlReader。那麼我怎麼能確定它支持線路信息? 仍然令人困惑 – 2008-10-07 14:47:06

0

感謝您的答案。

我知道基類沒有實現IXmlLineInfo。

但實際上我使用XmlTextReader.Create來獲取實際讀者的一個實例。

,所以我想實際的解決方案是使用XmlTextReader的構造函數,而不是工廠方法來防止這樣的困惑

+0

Microsoft建議使用Create方法:http://msdn.microsoft.com/zh-cn/library/9khb6435.aspx – JacquesB 2008-10-07 15:06:08