C# 如何在基类型的函数中调用泛型类型的构造函数,而不调用自己的构造函数?

C# 如何在基类型的函数中调用泛型类型的构造函数,而不调用自己的构造函数?,c#,generics,hash,C#,Generics,Hash,我认为测试我对泛型函数的理解的一个很好的方法是创建一个函数,该函数将使用从HashAlgorithm继承的一个类吐出哈希的十六进制表示。因为所有的HashAlgorithm类都提供ComputeHash,所以我认为这很简单。当我构造这样一个函数时。不过,我得到了一个错误,因为HashAlgorithm本身没有提供构造函数。我也找不到任何类型的接口或HashAlgorithm的子类提供构造函数。如果不是所有HashAlgorithm类都需要支持构造函数,那么我是否可以对泛型类型施加一些额外的约束,

我认为测试我对泛型函数的理解的一个很好的方法是创建一个函数,该函数将使用从HashAlgorithm继承的一个类吐出哈希的十六进制表示。因为所有的HashAlgorithm类都提供ComputeHash,所以我认为这很简单。当我构造这样一个函数时。不过,我得到了一个错误,因为HashAlgorithm本身没有提供构造函数。我也找不到任何类型的接口或HashAlgorithm的子类提供构造函数。如果不是所有HashAlgorithm类都需要支持构造函数,那么我是否可以对泛型类型施加一些额外的约束,以确保某个类型提供空构造函数,或者我将被迫为我知道的每个HashAlgorithm类创建一个重载来提供空构造函数

以下是我到目前为止(在非编译状态下)得到的信息:

公共静态字符串GetHexHash(流数据流tohash),其中hashAlgorithmouse:HashAlgorithm
{
StringBuilder结果=新建StringBuilder();
byte[]ByteHash=(新的HashAlgorithmouse()).ComputeHash(dataStreamToHash);
foreach(字节哈希中的字节哈希)
{
Result.Append(HashByte.ToString(“X2”));
}
返回Result.ToString();
}
Edit马特·汉密尔顿的答案马上就解决了这个问题,只是简单地使通用约束变得更复杂:
其中hashalgorithmouse:HashAlgorith,new()
。我甚至没有意识到我可以有多重约束。在我完全理解泛型之前,我肯定还有一段路要走。我想,如果您对约束过于着迷,您可以创建一个非常非泛型的泛型函数。

尝试将
new()
子句添加到泛型约束的末尾:

public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash)
    where HashAlgorithmToUse : HashAlgorithm, new()
public静态字符串GetHexHash(streamdatastreamtohash)
其中hashAlgorithmouse:hashAlgorithmouse,new()

这告诉类型“HashAlgorithmouse”有一个无参数(默认)构造函数。至少在Visual Studio 2008中,将
new()
约束添加到函数中,使其为我编译:

public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash) where HashAlgorithmToUse : HashAlgorithm, new()
{
    // ...
}
public静态字符串GetHexHash(streamdatastreamtohash),其中hashalgorithmouse:HashAlgorithm,new()
{
// ...
}
public static string GetHexHash<HashAlgorithmToUse>(Stream dataStreamToHash) where HashAlgorithmToUse : HashAlgorithm, new()
{
    // ...
}