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

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

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

using System;

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

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

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

public class User
{
    public Foo foo1;
    public Foo foo2;

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

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

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

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

public class Foo : Foo
{
    public Foo(...) : base(...) { }
}

public class FooEventArgs : FooEventArgs
{
    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, как'с чемFoo.Changed событие получит пропуск к нему (как значение придет изFoo).

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

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

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

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

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

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

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

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

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