关于是否强类型事件参数,有很多讨论。这个问题与此无关。我有以下类别(仅包括相关代码):
public abstract class Thread<TSender, TEventArgs>:
System.IDisposable
where TSender: Thread<TSender, TEventArgs>, new()
where TEventArgs: System.EventArgs, new()
{
public delegate void ThreadEventHandler (Thread<TSender, TEventArgs> sender, ThreadEventArgs e);
// This declaratino generates a VS 2012 warning.
public delegate void ThreadProcessIterationEventHandler<TSender, TEventArgs> (TSender sender, TEventArgs e);
}
第二个委托的声明生成VS2012警告:
1. Type parameter 'TSender' has the same name as the type parameter from outer type 'Thread<TSender,TEventArgs>'
2. Type parameter 'TEventArgs' has the same name as the type parameter from outer type 'Thread<TSender,TEventArgs>'
这种结构在逻辑上似乎是正确的,因为其目的是为派生类提供封装的线程机制。它当然是合法的代码,并按预期编译和运行。
我本以为具有自指向约束可能被认为是不好的做法,但为什么TSender
和TEventArgs
被标记为警告?这与声明NestedClass<TSender, TEventArgs>
不一样吗?
我应该找点什么吗?
UPDATE:第二个委托的目的是允许子类激发强类型事件。
您正在声明一个委托,带有新的类型说明符。您可以在没有额外泛型类型的情况下声明这一点:
public delegate void ThreadProcessIterationEventHandler(TSender sender, TEventArgs e);
通过将<TSender,TEventArgs>
放在委托声明中,它定义了新类型以在委托中使用,其名称与包含的泛型类型相同。就像你在写:
public delegate void ThreadProcessIterationEventHandler<TFoo, TBar>(TFoo sender, TBar e);
基本上,通过在中添加这些类型,您实际上可以使委托使用与包含类不同的类型。由于您使用了相同的名称,编译器会认为这是一个错误,并向您发出警告。
这是第二个失败的声明:
ThreadProcessIterationEventHandler<TSender, TEventArgs>(...)
不能在已声明类型参数TSender
的类型中声明名为TSender
的新类型参数。
不过,您不希望有一个新的泛型类型——您只想重用封装类型的类型参数:
public delegate void ThreadProcessIterationEventHandler(TSender sender, TEventArgs e);