定义泛型时new()的目的是什么?

时间:2011-12-15 09:18:31

标签: c#

我试图了解泛型。这是一个例子:

   public static bool CreateTableIfNotExist<T>(this CloudTableClient tableStorage, string entityName)
        where T : TableServiceEntity, new()
    {
        bool result = tableStorage.CreateTableIfNotExist(entityName);

        return result;
    }

我有几个问题。首先,定义中new()的目的是什么。我的另一个问题是,我该如何使用这个泛型。这里有一个例子:

_tableStorage.CreateTableIfNotExist<MembershipRow>(_tableName);

但我不明白。这个通用的目的是什么?我不能在没有通用的情况下做同样的事情吗?

_tableStorage.CreateTableIfNotExist("MyNewTable");

3 个答案:

答案 0 :(得分:9)

这是一个泛型类型约束,声明该类型必须具有公共无参数构造函数。

myCloudTableClient.CreateTableIfNotExist<TypeWithPublicParameterlessConstructor>("Customers");

Further reading

这主要用于允许通用代码构造 T的实例,而不是default(T) - 您可能经常看到的内容。不幸的是,当涉及到构造函数的约束时,除了公共无参数构造函数之外,没有任何约束支持。

更新:查看您更新的代码,通用版本从未使用过,因此在这种情况下它没有任何意义。泛型扩展方法的常用策略是支持泛型扩展方法。

public static bool Equals<T>(this T self, T other) where T : IEquatable<T>
{
    return self.Equals(other);
}
not 的示例中

更新2:指定类型约束,这仅在编译器根据用法使用类型约束could be inferred时才有效。 ..我不确定你的情况会发生什么,但我猜它不会编译。

答案 1 :(得分:1)

这是new constraint。这意味着只有具有不带参数的公共构造函数的类型才能成为泛型类型的类型参数。

所以像这样的课程:

public class Xyz{
  public string HelloWorld;
}

可以与该函数一起使用,但是这个类:

public class Abc{
  pulblic string HelloWorld;
  pulbic Abc(string hello){
    HelloWorld = hello;
  } 
}

不能,因为它没有所需的构造函数。

答案 2 :(得分:1)

T将替换为您在<>中指定的类型,这意味着如果您遗漏new,它将提供Type而不是实例InitializeTableSchemaFromEntity