Могу ли я сделать общий необязательный, по умолчанию для определенного класса?

Мой вопрос связан сЕсть ли разумный подход к параметрам типа «по умолчанию» в C # Generics?, но с использованием внутреннего универсального класса этот подход не работает.

Данный код выглядит так:

using System;

public class FooEventArgs<T> : EventArgs
{
    // ... T properties and a constructor
}

public class Foo<T>
{
    public delegate void EventHandler<FooEventArgs>(object sender, FooEventArgs<T> e);
    public event EventHandler<FooEventArgs<T>> Changed
}

И с этим используется так:

public class User
{
    public Foo<int> foo1;
    public Foo<object> foo2;

    public User()
    {
        foo1 = new Foo<int>();
        foo2 = new Foo<object>();
        foo1.Changed += foo1_Changed;
        foo2.Changed += foo2_Changed;
    }

    protected void foo1_Changed(object sender, FooEventArgs<int> e) { ... }
    protected void foo2_Changed(object sender, FooEventArgs<object> e) { ... }
}

Что ж, я бы предпочел, чтобы у меня был необязательный универсальный тип, поскольку будет много случаев, когда я не знаю, к какому типу что-то придет. (Данные поступают из внешней системы, которая имеет свои собственные типы переменных , которые затем преобразуются в типы .NET, но я сталкиваюсь с ситуациями, когда, например, один удаленный тип данных может превратиться в один из пары типов .NET, или когда он имеет тип «любой» - таким образомobject будет единственным реальным ответом для этого случая.)

Решение, которое сразу пришло мне в голову, было подклассом (это было также основным предложением в вопросе, связанном с ранее):

public class Foo : Foo<object>
{
    public Foo(...) : base(...) { }
}

public class FooEventArgs : FooEventArgs<object>
{
    public Foo(...) : base(...) { }
}

Затем я хочу использовать это так:

public class User
{
    public Foo foo3;

    public User()
    {
        foo3 = new Foo();
        foo3.Changed += foo3_Changed;
    }

    protected void foo3_Changed(object sender, FooEventArgs e) { ... }
}

Проблема в том, что он, естественно, не будет работать сfoo3_Changed принимающийFooEventArgs; это нужноFooEventArgs<object>, как это то, чтоFoo.Changed событие получит пропуск к нему (как значение придет изFoo<object>).

Foo.cs(3,1415926): error CS0123: No overload for 'foo3_Changed' matches delegate 'FooLibrary.Foo<object>.EventHandler<FooLibrary.FooEventArgs<object>>'

Могу ли я что-нибудь с этим сделать, кроме дублирования большей части класса?

Я попробовал еще одну вещь: неявный оператор для преобразования изFooEventArgs<object> вFooEventArgs.

    public static implicit operator FooEventArgs(FooEventArgs<object> e)
    {
        return new FooEventArgs(...);
    }

Это, к сожалению, похоже, не работает, хотя я не совсем понимаю, почему:

EditBuffer.cs(13,37): error CS0553: 'FooLibrary.FooEventArgs.implicit operator FooLibrary.FooEventArgs(FooLibrary.FooEventArgs<object>)': user-defined conversions to or from a base class are not allowed

Итак, еще раз, могу ли я что-нибудь сделать по этому поводу, или я правильно считаю, что это Tough Luck, и я просто должен быть доволен, используяFooEventArgs<object> (и тогда я думаю, что я могу просто использоватьFoo<object>)?

Ответы на вопрос(2)

Ваш ответ на вопрос