1

XML解析の場所参照を提供できるexcpetionクラスを使用しようとすると、興味深い動作が見つかりました。コンパイラは、XmlReaderをパラメータとして渡そうとしたときに、インターフェイスを消費するオーバーロードとSystem.Exceptionを必要とするオーバーロードのどちらかを選択できませんでした。

詳細は次のとおりです。

//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);

そして、正しいオーバーロードを選択できなかったために失敗しますが、なぜですか?XmlReaderがインターフェースをサポートしており、System.Exceptionから継承されていないことがわかります。

4

5 に答える 5

1

この線:

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

XmlReaderはIXmlLineInfoを実装していないためです。キャストが機能するかどうかはわかりませんが、キャストは静的にチェックされません。それが実際に機能する場合、それは具象クラス(XmlReaderから継承する)がこのインターフェースを実装しているためですが、コンパイラーはそれを知る方法がありません。

于 2008-10-07T14:39:41.357 に答える
0

どちらのオーバーロードも受け入れられないため、XmlReader呼び出しにオーバーロードを選択できませんでした。XmlReaderはExceptionを継承しないため、最初の呼び出しは無効です。XmlReaderもIXmlLineInfoを実装していません。

2番目のケースで機能する理由は、キャストを強制しているためです。ただし、実際にそのコードを実行すると、InvalidCastExceptionがスローされると思います。XmlReaderのドキュメントを読むと、XmlReaderが実装する唯一のインターフェースがIDispoableであることがわかります。

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

于 2008-10-07T14:41:22.727 に答える
0

XmlReaderではなく、IXmlLineInfoを実装するのはXmlTextReaderのようです

http://msdn.microsoft.com/en-us/library/system.xml.ixllineinfo(VS.71).aspx

于 2008-10-07T14:42:43.677 に答える
0

重要な部分を省略しました:

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

を返すメソッドを呼び出しますXmlTextReaderが、変数の型は ですXmlReader

キャストは実行時に行われるため、 の実行時の値をreaderにキャストできます。これは、サポートしていないにもかかわらず、そのインターフェイスをサポートしているIXmlLineInfoためです。XmlTextReaderXmlReader

ただし、オーバーロードの解決はコンパイル時に行われるため、XmlReaderサポートされていないためIXmlLineInfo、署名に一致しません。

次のように書くことで修正できます。

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

実際には を返す場合でも、の戻り値の型Createがであるため、キャストが必要であることに注意してください。XmlReaderXmlTextReader

于 2008-10-07T14:45:22.563 に答える
0

答えてくれてありがとう。

基本クラスが IXmlLineInfo を実装していないことがわかりました。

しかし、実際には XmlTextReader.Create を使用して実際のリーダーのインスタンスを取得していました。

したがって、実際の解決策は、ファクトリーメソッドの代わりに XmlTextReader コンストラクターを使用して、このような混乱を防ぐことだと思います

于 2008-10-07T14:50:11.523 に答える