C# C中泛型的默认类型。所以声明这是不可能的,但EventHandler似乎表现出这种行为?

C# C中泛型的默认类型。所以声明这是不可能的,但EventHandler似乎表现出这种行为?,c#,events,generics,delegates,C#,Events,Generics,Delegates,中的答案声称,如果泛型类的使用者未指定类型,则不可能指定将使用的默认类型参数 但是当使用预定义的通用EventHandler委托处理事件的引发时。。。如果您不需要在EventArgs参数内传递任何数据,则实际上不必指定类型参数。换句话说,不使用公共事件处理程序EventDelegate;,您可以只使用public EventHandler EventDelegate 在我对泛型的使用极其有限的情况下,我发现不指定类型参数就不可能使用泛型类,在回答链接问题时给出的答案与此一致,那么预定义的泛型Ev

中的答案声称,如果泛型类的使用者未指定类型,则不可能指定将使用的默认类型参数

但是当使用预定义的通用EventHandler委托处理事件的引发时。。。如果您不需要在EventArgs参数内传递任何数据,则实际上不必指定类型参数。换句话说,不使用公共事件处理程序EventDelegate;,您可以只使用public EventHandler EventDelegate


在我对泛型的使用极其有限的情况下,我发现不指定类型参数就不可能使用泛型类,在回答链接问题时给出的答案与此一致,那么预定义的泛型EventHandler委托如何违反此规则呢?

否。这不是“默认”值。EventHandler和EventHandler是完全不同的类型。IEnumerable和IEnumerable以及所有其他显示此模式的类似命名类型也是如此

你可以很容易地推出你自己的版本

class MyType
{
    void Foo(object obj) ...
}

class MyType<T> : MyType
{
    void Foo(T obj)
    {
        base.Foo(obj);
    }
}

不,这不是“默认”值。EventHandler和EventHandler是完全不同的类型。IEnumerable和IEnumerable以及所有其他显示此模式的类似命名类型也是如此

你可以很容易地推出你自己的版本

class MyType
{
    void Foo(object obj) ...
}

class MyType<T> : MyType
{
    void Foo(T obj)
    {
        base.Foo(obj);
    }
}

无视我先前的评论。我一定是在试图重载类名时出错了。通过定义两个类,一个非泛型MyStack和泛型MyStack,我能够模拟这种行为。我觉得奇怪的是,不能通过使用不同数量的类型参数来重载泛型类,但可以使用泛型和非泛型类重载类名。MyStack和MyStack可以共存,但MyStack和MyStack不能共存。我觉得很奇怪!从技术上讲,你不能让课堂“超载”。但是您可以使用从0到数千个参数的任意位置定义它的不同版本。请参阅Action以获取此.PS的一个实际示例:关于您在回答中给出的示例,这样做的好处是不必复制基类中存在的代码,同时仍然能够将MyType实例中允许的类型限制为T吗?PSS:GRRR。。。在我之前的评论中,MyStack的意思是MyStack,这是它的要点,但还有其他好处。您可以拥有同时包含MyType和MyType的MyType[]。如果没有非泛型基类,就无法创建类型安全、异构的MyType集合。顺便说一句,我不知道我做错了什么,使MyStack和MyStack生成了一个编译器错误,但我回到了那个项目,并编译了它,所以如果将来有人阅读这个线程,我想指出,事实上,通过使用不同数量的类型参数重用相同的泛型类名,就像使用委托类名一样。也许我在visualstudio中的T,U参数中遗漏了T,这与我在这里的注释中所做的相同。没有线索!无视我先前的评论。我一定是在试图重载类名时出错了。通过定义两个类,一个非泛型MyStack和泛型MyStack,我能够模拟这种行为。我觉得奇怪的是,不能通过使用不同数量的类型参数来重载泛型类,但可以使用泛型和非泛型类重载类名。MyStack和MyStack可以共存,但MyStack和MyStack不能共存。我觉得很奇怪!从技术上讲,你不能让课堂“超载”。但是您可以使用从0到数千个参数的任意位置定义它的不同版本。请参阅Action以获取此.PS的一个实际示例:关于您在回答中给出的示例,这样做的好处是不必复制基类中存在的代码,同时仍然能够将MyType实例中允许的类型限制为T吗?PSS:GRRR。。。在我之前的评论中,MyStack的意思是MyStack,这是它的要点,但还有其他好处。您可以拥有同时包含MyType和MyType的MyType[]。如果没有非泛型基类,就无法创建类型安全、异构的MyType集合。顺便说一句,我不知道我做错了什么,使MyStack和MyStack生成了一个编译器错误,但我回到了那个项目,并编译了它,所以如果将来有人阅读这个线程,我想指出,事实上,通过使用不同数量的类型参数重用相同的泛型类名,就像使用委托类名一样。也许我在visualstudio中的T,U参数中遗漏了T,这与我在这里的注释中所做的相同。没有线索!