【问题标题】:Extension method for with primitive parameters原始参数的扩展方法
【发布时间】:2011-10-24 07:49:20
【问题描述】:

我有一个这样声明的扩展方法:

public static IEnumerable<TEntity> AsEnumerable<TEntity>(this IDBQueryable<TEntity> dbQueryable) where TEntity : class
{
    return dbQueryable.Query.AsEnumerable();
}

下一个是使用示例:

//It works properly
IDBQueryable<Customer> customers = GetCustomerSet();
customers.AsEnumerable();

// It cannot be compiled because int type doesn't fullfill
// the constrains of the extension method
// It must be a reference type in order to be passed as a parammeter.
IDBQueryable<int> customerIDs = GetCustomerIDs();
customers.AsEnumerable();

我怎样才能有一个适用于我展示的两个用例的扩展方法? 提前谢谢你。

【问题讨论】:

  • @Eric Int32 在 .NET 中与 int相同;没有拳击(它只是一个语言级别的别名;int === global::System.Int32)
  • 如果您删除了对扩展方法的约束,是否会出现编译错误?
  • @Eric 重点是我的 POCO Id 是用 Id 定义的,这不是我可以更改的。
  • @Nick 是的,我收到此错误类型“TEntity”必须是引用类型才能将其用作泛型类型或方法“”中的参数“TEntity”
  • 您在上一条评论中遗漏了重要的一点:...在泛型类型或方法中 '[important bit]'

标签: c# generics extension-methods constraints


【解决方案1】:

只需删除 where TEntity : class 约束即可。这里没有明显的约束需要,任何使用: class 或: struct 都会阻止这两个用例之一。

【讨论】:

  • 按照您的说法,我得到一个编译错误。类型“TEntity”必须是引用类型,才能将其用作泛型类型或方法“”中的参数“TEntity”
  • @jersiovic 那么你需要告诉我们还有什么地方有这个限制,因为不管它在哪里,都不是问题。
  • 你说得对,我忘了 IDBQueryable 有一个类约束。非常感谢。我在 StackOverflow 上的第一个问题,您的快速回答给我留下了深刻的印象
  • @jersiovic 除非您删除该约束,否则IDBQueryable&lt;int&gt; 是不可能的,那么
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 2015-11-16
相关资源
最近更新 更多