我的问题与C#泛型中的“默认”类型参数有关是否有合理的方法来处理C#泛型中的“默认”类型参数?,但使用内部泛型类时,这种方法行不通。
给定如下代码:
我希望如果可以使用泛型的可选项,这样在许多情况下,我就不需要知道某个东西将会是什么类型。(数据来自一个具有其自身变量类型的外部系统,这些类型然后被转换为.NET类型,但我遇到了一些情况,例如,一个远程数据类型可能会转换成几种.NET类型中的一种,或者它是"任意"类型 - 因此, 对于那种情况,
我所想到的解决方案是子类化(这也是之前链接问题中的主要建议):
我希望您能像这样使用它:
问题在于它不能自然地与接受
很不幸,这似乎无法正常工作,尽管我不太清楚原因是什么。
给定如下代码:
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) { ... }
}
问题在于它不能自然地与接受
FooEventArgs
的foo3_Changed
一起使用;它需要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>
)?