【问题标题】:Why can't I use a Guid as a generic type constraint?为什么我不能使用 Guid 作为泛型类型约束?
【发布时间】:2014-08-13 01:34:45
【问题描述】:

我有如下通用方法,我想将 T 限制为仅是 Guid 类型,如下所示:

public static EntityFindApiResponse EntityFind<T>(
    Credential cred, EntitiesApiClient entitiesApiClient, string clrType, 
    string propertyName, T searchKey)
    where T: Guid
{
    // ...
}

编译器告诉我

'System.Guid' 不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数。

那么,为什么这不起作用?

【问题讨论】:

  • 看来你可以去掉 type 参数,让 EntityFindApiResponse 的最后一个参数为 Guid 类型;你试过这个吗?

标签: c# generics types constraints


【解决方案1】:

首先,Guid 是一个struct。您不能将通用约束设置为 struct,因为不能从 structs 派生(这意味着您不能从 struct 继承)。

除此之外,where T: Guid 真正读作“其中 T 的类型为 Guid 或派生自 Guid 的类型”,因为没有任何东西可以从 struct 派生,这就像说“其中 T 是类型Guid”一开始就违背了泛型的目的。

【讨论】:

    【解决方案2】:

    Guid是结构体,不符合要求:

    用作约束的类型必须是接口,非密封类 或类型参数。

    【讨论】:

    • 也可以是struct,它允许将值类型用作类型参数(尽管您不能对特定的结构类型施加约束)。
    • 是的,你是对的。但它如何适用于这个问题呢?
    • 不,不是这个问题。到您的允许约束列表。
    • 我不明白。这个问题是关于为什么我不能使用具体的结构类型 (Guid) 作为泛型类型约束。这与什么是可能的通用约束无关。你认为我还应该提到约束泛型类型参数classstructnew() 的所有其他可能方法吗?
    • 我不是在寻找论据。我明白你在说什么。就在我第一次阅读您的答案时,似乎这就是类型约束可用的全部内容。无意冒犯。
    猜你喜欢
    • 2020-09-10
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多