我的问题与C# 泛型中的“默认”类型参数是否有合理的方法有关?,但是使用该方法不起作用的内部泛型类。
给定这样的代码:
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
那么,再一次,我能做些什么呢,还是我认为这是运气不好,我只需要满足于使用FooEventArgs<object>
(然后我想我也可以使用Foo<object>
)是正确的吗?