对C#泛型的反约束
受是否有任何方法可以在IEnumerable版本的定义上放置"反施加",这样我就可以告诉编译器,只要T的类型是 not string?像 public static IEnumerable AsNullIfEmpty(this IEnumerable items) where T !: string 我知道我可以更改其中一个名称,但我想拥有相同的名称以保持一致性. 更新:通过修复简单而愚蠢的错误,事实证明我对扩展方法的问题是另一种解决的(我正在使用str.IsNullOrEmpty(),而是str.IsNullOrEmpty(),而是IEnumerable上的扩展方法,而是string.IsNullOrEmpty(str) ...)但是,由于关于仿制药的反构造问题仍然是一个有趣的问题,所以我不会删除它. 解决方案 这样做的唯一方法是创建此扩展的过载,该扩展名接受A string作为其this参数. public static str
0 2024-04-21
编程技术问答社区
为什么我不能使用Guid作为通用类型约束?
我具有以下一般方法,我想将t限制为类型的GUID类型: public static EntityFindApiResponse EntityFind( Credential cred, EntitiesApiClient entitiesApiClient, string clrType, string propertyName, T searchKey) where T: Guid { // ... } 编译器告诉我 'system.guid'不是有效的约束.用作约束的类型必须是接口,非密封类或类型参数. 那么,为什么这不起作用? 解决方案 首先,事实证明Guid是struct.您不能将通用约束设置为struct,因为不能从struct s派生(这意味着您不能从struct>继承). 此外,where T: Guid确实读出" t属于Guid的t,源自Guid>"的类型,并且由于没有什么可以派生的形式a str
0 2024-04-21
编程技术问答社区
编译器在转换受约束的通用类型时失败
我有一个具有通用类型的" G" 的类 在我的班级模型中,我有 public class DetailElement : ElementDefinition 假设我有这样的方法 public void DoSomething(G generic) where G : ElementDefinition { if (generic is DetailElement) { ((DetailElement)generic).DescEN = "Hello people"; //line 1 ////// ElementDefinition element = generic; ((DetailElement)element).DescEN =
0 2024-04-21
编程技术问答社区
对可数据库的强制约束(EnforceConstraint)
数据集上是一个执行属性,指示是否应启用约束.尽管数据表也可能具有约束,但我无法禁用数据表的约束. 我的情况是,我具有在内存中使用的DataTable,其中一列上有一个独立的数据.有时我想暂时禁用独特的约束.我怎样才能做到这一点?我唯一想出的是删除并重新添加约束.有更好的方法吗? 解决方案 基本上我所做的是循环穿过违反并将其删除.执行操作并重新添加表上的约束 其他解决方案 我的解决方案是这个 using (IDataReader reader = ExecuteReader(sql)) { DataTable dt = new DataTable(); using (DataSet ds = new DataSet() { EnforceConstraints = false }) { ds.Tables
0 2024-04-21
编程技术问答社区
ADO.NET命令生成器、InsertCommand和默认约束条件
i正在将数据从表A复制到表B. 表B具有无效的列,该列的默认约束值为0. 通常,我使用以下访问者设置列的值. public object this[string columnName] { get { return DataTable.Rows[CurrentRow][columnName]; } set { DataTable.Rows[CurrentRow][columnName] = value; } } 但是我做 设置我的无效列X. 当我插入整个行时,不使用默认值.而不是0,将null插入了无效的列. _sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter); _sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; _sqlCommandBuilder.SetAllValues = false; _s
0 2024-04-21
编程技术问答社区
使用比较运算符,如'!='和'==',在C#中用泛型约束为值
我有以下代码: class Foo where T : struct { private T t; [...] public bool Equals(T t) { return this.t == t; } } 当我尝试编译时,它会给我以下错误: 运算符'=='不能应用于't'和't' 的操作数 为什么不能这样做?如果约束是where T : class,它将有效.但是我需要它是价值类型,因为在我的实施中,这个通用将永远是一个枚举. 我正在使用Object.Equals()方法来循环.它会一直确保正确的行为,因为我仅在t? 之间进行比较 解决方案 这是约束系统的不受欢迎的限制.除非在接口中定义,否则您不能根据其特定操作来约束价值类型.因此,您不能限制运算符的定义,因为它们不会在所有值类型上定义,并且struct约束允许将任何值类型传递. struct A { } 没有定义的==,但是您的约束表示您很乐意接受它.因此您
0 2024-04-20
编程技术问答社区
为Nullable Enum添加约束条件
我正在编写一些枚举功能,并具有以下内容: public static T ConvertStringToEnumValue(string valueToConvert, bool isCaseSensitive) { if (typeof(T).BaseType.FullName != "System.Enum" && typeof(T).BaseType.FullName != "System.ValueType") { throw new ArgumentException("Type must be of Enum and not " + typeof (T).BaseType.FullName); } if (String.IsNullOrWhiteSpace(valueToConvert)) return (T)typeof(T).TypeInitializer.Invoke(null); val
0 2024-04-20
编程技术问答社区
使用受限通用类型的静态方法 C#
我有一个通用类: public class Foo where T: Interface { } 被迫实现T的接口具有在其内部定义的2种静态方法. 在构造函数中,我希望基本上能够做以下操作: public Foo() { value1 = T.staticmethod1(); value2 = T.staticmethod2(); } 这是我上面发布的psuedocode无法完成的.是否不可能以这种方式调用这些静态方法? 解决方案 您可以使用扩展方法.该技术已被命名为 pseudo-mixins . 尽管扩展方法实际上是静态的,但它们"假装"为实例方法,因此您仍然需要t. 的具体实例 另外,如果您希望您的界面保留其作为自我记录的"合同"的作用,则可以说明您的T类应具有的方法. 但是它们是类型的安全性(如果您不带范围中的ibarextensions,您的FOO类都不会编译) //our interface public int
0 2024-04-19
编程技术问答社区
带有通用类声明的命名空间约束
我想知道(如果是这样)是否可以将名称空间定义为通用类声明中的约束参数. 我拥有的是: namespace myproject.models.entities namespace myproject.tests.basetest 现在,我的" tasteast"班级的解体看起来像; public class BaseTest 此BaseTest在测试过程中删除所有添加到数据库中的实体(在写作时)的作用(在写作时)几乎没有多.因此,通常我会将测试类声明为: public class MyEntityRepositoryTest : BaseTest 我想做的是类似于以下内容: public class BaseTest where T : 现在,我知道完全有可能简单地声明"基础"类,从该类别中创建的所有实体都将从 中继承
0 2024-04-19
编程技术问答社区
检测通用参数的最大值
我想编写应该使用byte和ushort类型的通用类.我应该在此课程中使用什么约束?如何在此类内检测MaxValue属性? class MyClass // where T: ??? { void Foo() { int maxValue = T.MaxValue; // how can I do this? } } 如果以意外类型创建了类(不包含MaxValue属性),我不在乎 - 例如,我可以在运行时抛出异常. 解决方案 一种方法是利用新的dynamic关键字: void Main() { Test(10); Test(10.234); Test((Byte)42); Test(true); } public void Test(T value) where T : struct { T maxValue = MaxValue((dynamic)val
0 2024-04-19
编程技术问答社区
如何有条件地调用一个有约束的通用方法?
假设我有一种不受限制的通用方法,可用于支持平等的所有类型.它执行成对的平等检查,因此在 o(n 2 )中起作用: public static int CountDuplicates(IList list) { /* ... */ } 我也有一个受约束的通用方法,仅适用于支持排序的类型.它从在 o(n log n)中对列表进行排序,然后在一个通过中计数所有重复项: public static int CountDuplicatesFast(IList list) where T : IComparable { /* ... */ } 因此,如果静态知道列表的元素类型支持订购,则可以选择调用快速方法.呼叫者本身可能会与t不受限制的generic IList一起工作,因此它是调用第一个(慢)方法的唯一选择. 现在,我希望第一个在运行时检查类型T实际实现界面IComparable的方法,如果是,
0 2024-04-17
编程技术问答社区
你能在多个通用类型参数上执行同一个约束吗?
我知道你可以这样做: void M() where T1 : S where T2 : S where T3 : S {} 我想要这样的东西: void M() where T1, T2, T3 : S {} 是否有此类快捷方式? 解决方案 否,不支持. C#语言规范 每个类型 - 参数符合条件范围都由令牌组成,随后是类型参数的名称,然后是结肠和该类型参数的约束列表. 这里的关键是 a ,表明格符需要where : ,, etc...
0 2024-04-17
编程技术问答社区
如何根据对象的大小(或一些系统约束)动态地控制平行度?
让我们简化这种情况.有一台具有16 GB RAM的机器和4个CPU内核.给出了不同尺寸的对象列表,例如[3,1,7,9,4,5,2],每个元素肯定需要基于其大小的相应数量的RAM,例如" 1"将需要1 GB RAM. 处理此元素列表的最佳方法是什么是在并行中,而不会引起OutOfMemory在C#中,并使用并行库库(内置或第三方)? 一个幼稚策略可能是: 第一轮:选择[3,1,7].仍然有一个核心,但是如果使用" 9",则该程序需要20 GB RAM.因此,让我们现在使用3个内核. 第二轮:如果" 3"首先完成,请考虑" 9",但仍然超过16 GB RAM容量(1+7+9 = 17).所以,停下来等待. 第三轮:如果完成" 7",则该程序将以" 1"," 9"和" 4". 继续前进. 我不是算法和并行性的专家.因此,我无法在更具体的细节中解决这个问题...任何帮助,链接,建议将受到高度赞赏.我相信这个问题可能已经解决了其他地方,我不需要重新发明轮子.
0 2024-04-16
编程技术问答社区
尽管有通用约束,C#类型转换错误
为什么,对"必须从一个必须继承"类的类型参数t构成一般限制,第一个呼叫是否成功,但第二个呼叫失败,并在评论中详细介绍了类型转换错误: abstract class A { } static class S { public static void DoFirst(A argument) { } public static void DoSecond(ICollection argument) { } } static class P where T : A, new() { static void Do() { S.DoFirst(new T()); // this call is OK S.DoSecond(new List()); // this call won't compile with: /* cannot convert
0 2024-04-16
编程技术问答社区
实体框架中Unique字段的选项-导航属性到dbSet?
经过大量研究,似乎实体框架4.4不支持独特的约束.是的,它可以在数据库中完成,但是我更喜欢在模型验证中发生,因此对用户的警告更漂亮. 对于程序员来说,能够使用[唯一]属性来装饰该属性是理想的选择,例如: public class UserGroup { public int UserGroupID { get; set; } [Required] [Unique] public string Name { get; set; } [Required] public string Description { get; set; } } 我正在考虑的选项: 1)让存储库在savechanges()上做一些额外的工作,扫描修改后的实体上的[唯一]属性,然后点击数据库以检查唯一性.缺点:此验证仅在我们调用savechanges()时才发生,理想情况下它可以发生(例如,在UI控件验证时). 2)将UserGroup
0 2024-04-16
编程技术问答社区
是否有可能限制一种只针对记录的方法?
让我们假设我有几种不同的record types,具有公共接口,如下: record Rec1( string Tag ) : IFoo; record Rec2( int Num, string Tag ) : IFoo; record Rec3( bool Flag ) : IFoo { public string Tag { get; init; } public double Value { get; init; } } // ... others ... interface IFoo { string Tag { get; } } 我的目标是编写一个函数以通过记录克隆更新标签属性. 现在,如果已知类型,我可以写这样的东西: private Rec2 Update(Rec2 rec, string tag) { return rec wit
0 2024-04-16
编程技术问答社区
为什么带有约束条件的通用扩展方法不被认可为扩展方法?
可能的重复: 无通用扩展方法 no类型推断 考虑两种方法: public static IEnumerable Merge (this IEnumerable> coll) public static IEnumerable Merge (this IEnumerable coll) where T : IEnumerable 两者都很好地编译,在两种情况下,通用类型的类型在呼叫者的编译时都会知道,因此,扩展类型的确切类型. 您可以将两者都命名,但只能将第一个称为扩展名. 为什么? 更新1 要看到失败,请使用第二种方法和此类示例: var x = new List>(); var y = x.Merge(); 更新 - 关闭 你们难道不认为原始帖子太精致而无法获得清晰
0 2024-04-15
编程技术问答社区
一个有两个不相等(唯一)类型的通用类
是否可以实现约束两个唯一通用参数的类? 如果不是这样,是因为它是不完成的,或者因为语言结构(继承)是不可能的吗? 我想要一些形式: class BidirectionalMap where T1 != T2 { ... } 我正在实施双向字典.这主要是一个好奇问题,而不是需要的问题. 从评论中解释: dan:"如果不满足此约束,负面后果是什么?" me:"那么用户可以用映射[t1]和映射[t2]索引.如果它们是相同的类型,那将没有区别,也没有任何意义." dan:编译器实际允许[两个通用类型参数定义不同的方法过载],所以我很好奇; 它是否任意选择一种调用的方法之一? 解决方案 在示例上扩展以突出该问题: public class BidirectionalMap { public void Remove(T1 item) {} public void Remove(T2 item)
0 2024-04-15
编程技术问答社区
为什么接口不起作用,而抽象类在通用类约束下起作用?
下面的代码显示具有类型约束(Pub)的通用类.该课程有一个事件,它可以提出,使我们能够将消息传递给订户.约束是该消息必须实现IMsg(或从IMsg是抽象类中继承). Pub还提供了Subscribe方法,允许对象订阅notify事件,并且仅当对象实现IHandler. 时 使用.NET 4,下面的代码在baseImplementer.NotifyEventHandler上显示了一个错误,指出: "No overload for 'IHandler.NotifyEventHandler(IMsg)' matches delegate 'System.Action'" 问题:(使用更新的订阅方法) 为什么我只要将`imsg'更改为抽象类而不是接口? public interface IMsg { } // Doesn't work //public abstract class IMsg { } // Do
0 2024-04-15
编程技术问答社区
如何指定.NET泛型约束中不允许的类型?
是否可以对不承认某些类型的通用类指定约束?我不知道是否可能,如果是,我不确定语法是什么.类似: public class Blah where : !string { } 我似乎找不到任何允许这种约束的符号. 解决方案 最接近的是运行时约束. 编辑:最初,我将运行时检查放入构造函数调用中.实际上,这并不是最佳的,因为它在每个实例化上都蒙上了开销.我相信将支票放入 static 构造函数中会更加明智,将每类用作您的Blah> type的T参数一次: public class Blah { static Blah() { // This code will only run ONCE per T, rather than every time // you call new Blah() even for valid non-string type Ts if (typeof(T)
0 2024-04-15
编程技术问答社区