2

すべて-クラスの1つに次の2つのメソッドがあります。

public static void DeSerializeFromXml(out cDBData db, string pathToXML)
{
    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDBData));
        db = (cDBData)ser.Deserialize(reader);
    }
}

public static void DeSerializeFromXml(out cDatabases db, string pathToXML)
{
    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDatabases));
        db = (cDatabases)ser.Deserialize(reader);
    }
}

それらは正常に機能しますが、メソッドの戻り型に基づいてメソッドのオーバーロードを作成できないのはなぜだろうと思っていました。私はこれがどこかで可能であると読んだと思いましたが、それが機能しないので明らかに間違っています:

public static cDBData DeSerializeFromXml(string pathToXML)
{
    cDBData db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDBData));
        db = (cDBData)ser.Deserialize(reader);
    }
    return db;
}

public static cDatabases DeSerializeFromXml(string pathToXML)
{
    cDatabases db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDatabases));
        db = (cDatabases)ser.Deserialize(reader);
    }
    return db;
}

思いやりのある対応ありがとうございます

dlevのおかげで、これが最終的な解決策です

    public static T DeSerializeFromXml<T>(string pathToXML)
    {
        T db;

        using (XmlTextReader reader = new XmlTextReader(pathToXML))
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));
            db = (T)ser.Deserialize(reader);
        }
        return db;
    }

    public static void SerializeToXml<T>(T db, string pathToXML)
    {
        using (var fileStream = new FileStream(pathToXML, FileMode.Create))
        {
            var ser = new XmlSerializer(typeof(T));
            ser.Serialize(fileStream, db);
        }
    }

検索警察がこの質問を閉じる前に、これらを投稿してもらいたかったのです。

4

3 に答える 3

6

C# はそのようなオーバーロードをサポートしていないため、これを行うことはできません。メソッドをジェネリックにして、ジェネリック パラメータ タイプを返すことで、同様の効果を得ることができます。

public static T DeSerializeFromXml<T>(string pathToXML)
{
    T db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(T));
        db = (T)ser.Deserialize(reader);
    }
    return db;
}

次に、次のように関数を呼び出すことができます。

DeSerializeFromXml<cDatabases>(pathToXml);

これはあなたが望んでいたものではありませんが、必要なメソッドが 1 つだけであるという利点があります。

于 2012-06-26T21:41:46.403 に答える
3

メソッドの戻り値の型に基づいてメソッドのオーバーロードを作成できないのはなぜだろうと思っていました。

それは単に不可能です。オーバーロードの解決中に戻り値の型は考慮されず、言語はこのようにオーバーロードを試みることを禁止しています。C# 4 仕様のセクション 3.6 から:

メソッドのシグネチャは、メソッドの名前、型パラメーターの数、および各仮パラメーターの型と種類 (値、参照、または出力) で構成され、左から右の順序で考慮されます。これらの目的のために、仮パラメーターの型で発生するメソッドの型パラメーターは、その名前ではなく、メソッドの型引数リスト内の序数位置によって識別されます。メソッドのシグネチャには、戻り値の型、一番右のパラメーターに指定できる params 修飾子、オプションの型パラメーターの制約は含まれません。

戻り値の型はここには含まれていないことに注意してください。次に、次のようになります。

シグネチャは、クラス、構造体、およびインターフェイスのメンバーのオーバーロードを可能にするメカニズムです。

  • メソッドのオーバーロードにより、クラス、構造体、またはインターフェイスで同じ名前の複数のメソッドを宣言できます。ただし、それらのシグネチャがそのクラス、構造体、またはインターフェイス内で一意である場合に限ります。

これの動機に関して言えば、式のタイプが式の使用方法に依存する場合、人生は非常に複雑になります。これ一部の式 (nullラムダ式など) には当てはまりますが、メソッド呼び出しなどには当てはまりません。非常に奇妙な状況に陥る可能性があります。

public void Foo(int x) {}
public void Foo(long y) {}

public int Bar() {}
public long Bar() {}

Foo(Bar()); // What would this call?
于 2012-06-26T21:41:30.837 に答える
0

汎用オブジェクトを返さないのはなぜですか? その場合、おそらくオーバーロードする必要はありません。

于 2012-06-26T21:43:02.703 に答える