Tag: 类型约束

为什么MassTransit消息中不允许使用结构?

MassTransit的使用者接口都希望消息模型是类而不是结构。 因为它们都是内部接口(我必须说非常好的设计),这是显示约束的通用容器类,直接取自源代码 : /// /// Declares a Consume method for the message type TMessage which is called /// whenever aa message is received of the specified type. /// public static class Consumes where TMessage : class 对于刚开始使用该技术的人来说,这不是一个问题,但这对我们来说很麻烦,因为在我们的代码库中已经有了与命令模式相关的对象,甚至在考虑使用服务总线框架之前,所以我们不得不改变了很多接口和generics类来为它们添加这个约束来与MT一起工作。 我们很幸运没有明确地拥有任何struct类型,因为这可能会导致更多(可能是不需要的)更改。 为什么它要求消息类成为一个class ? 是否可以更改它,以便库与现有代码更加无缝地连接? 我认为虽然没有添加约束,所以可能存在一些并发症。

有没有办法将这些几乎相同的类合并为一个?

这个问题的后续问题: 为什么Nullable 被认为是结构而不是类? 我有两个类,基本上维护一个用户提供的值的元组与内部对象。 当用户提供的值的类型是基元时,我必须将它包装在Nullable以便它可以在元组中采用空值。 public class BundledClass where T : class { private Tuple _bundle; public T Value { get { return _bundle == null ? null : _bundle.Item1; } set { _bundle = new Tuple(value, internalObj); } } //… public class BundledPrimitive where T : struct { private Tuple _bundle; public T? Value […]

非严格的多接口类型参数约束?

对不起,如果这是一个欺骗,但我似乎无法得到正确的关键字组合来过滤各种类型约束和generics问题(因为有很多)。 我有两个接口 – 让我们称它们为IOnline和IOffline 。 它们密切相关,因为它们描述了几乎相同的契约,但它们之间的关键差异之一是将使用具体实现的上下文。 这不完全是我的情况,但它很好地说明了问题。 然后,我有一些方法可以解决这些接口的具体实现。 有时这些方法只想处理一种类型而不是另一种类型。 很简单: public void DoStuff(string foo) where T : IOnline {} 踢球者正在实施可以在EITHER类型上操作的方法的代码。 我认为这是正确的,但在阅读编译错误时,我期望约束将被解释为“允许任何类型T在这里一般使用,如果它们实现IOnline OR IOffline”,实际上被解释为“允许任何类型”如果它们同时实现,则在这里使用T“。 public void DoStuff(string foo) where T : IOnline, IOffline {} 尝试实现具有相同名称但不同约束的两个单独方法失败,因为存在明显的歧义问题 – 我们没有超载,因为参数列表是相同的(因为期望的行为是相同的)。 我可以为两种不同的方法使用两个不同的名称,每个方法都有适当的约束,但这看起来很糟糕,并使下游的其他东西成为屁股中的痛苦……可行但不理想。 我觉得必须有一些我在这里缺少的东西…我觉得在通用土地上非常舒服,但这是我第一次完成我所追求的目标,我觉得我只是在旋转我的车轮atm。

如何将generics约束为类型枚举?

请考虑以下代码: class Base { //Base members } 我希望通用T是一个枚举(如果可能的话使用约束)。 我怎么能在C#中做到这一点? 编辑: 使用代码契约 – 由Akash Kava引入 – 似乎也是一种很好的方式。 我设法让它产生运行时错误,这是无用的。 这是我试过的代码。 应该可以生成编译时警告但我无法使其工作。

如何在另一个通用基类上添加C#generics类型约束?

我已多次阅读有关C#generics类型参数约束的MSDN文档,但我无法弄清楚如何执行此操作,或确定它是否可行。 假设我有一个像这样的通用基类: public abstract class Entity { … } 这个抽象基类没有任何类型约束, TId可以是任何东西 – 结构,类等。 现在说我有一个通用的接口方法,我想将方法​​的generics类型约束到上面的类: public interface ICommandEntities { void Update(TEntity entity) where TEntity : ?????; } 我可以这个编译: public interface ICommandEntities { void Update(TEntity entity) where TEntity: Entity } …然而,我需要在执行方法时显式添加两个T1 ant T2genericsargs: commander.Update(abcEntity); 如果可能的话,我想让编译器推断所有内容,这样我就可以执行这样的方法: commander.Update(abcEntity); 这个活动可能吗? 到目前为止,我能让它工作的唯一方法是在generics基类之上添加一个空的非generics基类,并将其用作方法的类型约束: public abstract Entity {} public abstract EntityWithId : Entity […]

当作为具有接口约束的通用参数传递时,值类型是否装箱?

(作为回答这个问题的研究结果,我(我想我有!)确定答案是“不”。但是,我不得不在几个不同的地方找出来解决这个问题,所以我认为还有如果社区投票结束,我不会感到沮丧。) 例如: void f(T val) where T : IComparable { val.CompareTo(null); } void g() { f(4); } 4盒装? 我知道显式地将值类型转换为它实现触发装箱的接口: ((IComparable)4).CompareTo(null); // The Int32 “4” is boxed 我不知道的是,将值类型作为具有接口约束的generics参数传递是否等于执行强制转换 – 语言“其中T是IC可压缩”类型建议转换,但只是将T转换为IComparable似乎它会破坏通用的全部目的! 为了澄清,我想确保在上面的代码中没有发生这些事情: 当g调用f(4) , 4被IComparable为IComparable因为f的参数类型存在IComparable约束。 假设(1)没有发生,在f内, val.CompareTo(null)不会将val从Int32为IComparable以调用CompareTo 。 但我想了解一般情况; 不仅仅是int和IComparable发生了什么。 现在,如果我将以下代码放入LinqPad: void Main() { ((IComparable)4).CompareTo(null); f(4); } void f(T val) where T : IComparable { val.CompareTo(null); } […]

将类型参数约束为基本类型

我知道如何强制类型参数成为另一种类型的子类型: public interface IMapping { public void Serialize(T3 obj) where T3 : T2; } … var mapping = MapManager.Find(); mapping.Serialize(new TonkaTruck()); 有没有办法强制类型参数成为另一种类型的超类型? public interface IMapping { public void IncludeMappingOf() where T2 : T1; // <== doesn't work } … var mapping = MapManager.Find(); // Truck inherits Vehicle // Would like compiler safety here: mapping.IncludeMappingOf(); mapping.Serialize(new […]

具有新类型约束的通用构造函数

我有两种类型的对象,数据库模型和普通系统模型。 我希望能够将模型转换为数据库模型,反之亦然。 我写了以下方法: public static E FromModel(T other) where T : sysModel where E : dbModel { return new E(other); } 基本上sysModel和dbModel都是抽象的。 dbModel有许多inherting类,都有复制构造函数。 我收到: 无法创建类型参数“E”的实例,因为它没有new()约束 我知道技术上有时我没有为T每个值都有匹配的构造函数,至少调试器知道什么。 我也尝试添加where E : dbModel, new()约束,但它只是无关紧要。 有没有办法使用generics方法和使用参数将模型转换为另一个模型? 谢谢。

为通用参数指定构造函数约束

我有一组对象,我作为参数传递给另一种类型的对象(一对一)。 我在很多地方这样做(基本上是从数据对象转换为业务对象)。 我想写一个通用的扩展方法来完成这个。 但是我被卡住了,因为我不知道如何指定业务对象具有将数据对象作为参数的构造函数的约束。 以下是我的function代码: public static IList ConvertTo(this IEnumerable list) where T : new(A)/*THIS IS PROBLEM PART*/ { var ret = new List(); foreach (var item in list) { ret.Add(new T(item)); } return ret; }

自反型参数约束:X 其中T:X – 任何更简单的替代方案?

我经常通过向其添加自引用(“反身”)类型参数约束来使简单的界面更复杂。 例如,我可能会这样做: interface ICloneable { ICloneable Clone(); } class Sheep : ICloneable { ICloneable Clone() { … } } //^^^^^^^^^^ Sheep dolly = new Sheep().Clone() as Sheep; //^^^^^^^^ 成: interface ICloneable where TImpl : ICloneable { TImpl Clone(); } class Sheep : ICloneable { Sheep Clone() { … } } //^^^^^ Sheep dolly = new […]