Могу ли я сделать общий необязательный, по умолчанию для определенного класса?
Мой вопрос связан сЕсть ли разумный подход к параметрам типа «по умолчанию» в 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>
)?