c# - public T GetMyClass<T>() where T : MyClass, new() {/* 这是没有意义的吗? */}

标签 c# .net generics activator

下面“Confused”类中的两个方法是否相同?

class MyClass
{
    public override string ToString()
    {
        return "I am confused now";
    }
}

class Confused
{    
    public MyClass GetMyClass()
    {
        return new MyClass();
    }

    public T GetMyClass<T>() where T : MyClass, new()
    {
        return System.Activator.CreateInstance<T>();
    }
}

class Program
{
    static void Main()
    {
        Confused c = new Confused();
        System.Console.WriteLine(c.GetMyClass());
        System.Console.WriteLine(c.GetMyClass<MyClass>());
    }
}

它们产生不同的 IL,但是除了让同事感到困惑之外,还有什么理由编写通用版本而不是“直接”版本 :)

最佳答案

如果您编写泛型版本,则可以实例化并返回派生类:

哪里 T : MyClass

此外,对于通用版本,您不需要激活码:

return new T();

这是因为您指定了:

哪里 T : new()

强制执行公共(public)无参数构造函数的通用约束。

关于c# - public T GetMyClass<T>() where T : MyClass, new() {/* 这是没有意义的吗? */},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6694792/

相关文章:

c# - MailSystem.Net 删除邮件,IndexOnServer 属性 = 0

c# - 在 VB.NET 与 C# 中实现属性的多级继承

c# - C# 中的原子读-修改-写

Java 将子类型实例添加到父类(super class)型的集合中?

ios - 扩展匹配泛型的父类(super class)?

c# - SQL Server表中如何防止重复

c# - 优雅的解决方案 - 使用 Linq-To-SQL 批量删除和重新添加相关的子列表

c# - 打开一个包含来自 gridview 单元格的详细信息的 ajax modalpopup

java - 通用映射参数 java

c# - Entity Framework 在一个请求中加载多个集合