Tag: 约束

XML Serialize boolean为0和1

XML Schema Part 2指定定义为boolean的数据类型的实例可以具有以下合法文字{true,false,1,0}。 例如,在反序列化时,以下XML将布尔属性“Emulate”设置为true 。 1 但是,当我将对象序列化回XML时,我得到的是true而不是数值。 我的问题是,有没有办法可以控制XML中的布尔表示?

排除通用约束中的类型(可能?)

是否可以从可能类型的集合中排除特定类型,可以在通用参数中使用? 如果是这样的话。 例如 Foo() : where T != bool 将意味着除bool类型之外的任何类型。 编辑 为什么? 以下代码是我尝试强制执行否定约束。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var x1=Lifted.Lift(“A”); var x2=Lifted.Lift(true); } static class Lifted { // This one is to “exclude” the inferred type variant of the parameter [Obsolete(“The […]

C#多个通用约束

我想知道是否可以添加多个通用约束? 我有一个Add方法,它接受一个Object(电子邮件,电话或地址),所以我想的是: public void Add(T Obj) where T : Address where T : Email where T : Phone { if (Obj is Address) m_Address.Add(Obj as Address); else if (Obj is Email) m_Email.Add(Obj as Email); else m_Phone.Add(Obj as Phone); } 但我一直在: “A constraint clause has already been specified for type parameter ‘T’. All of the constraints […]

为什么在generics参数约束中强制执行某些排序?

在定义generics类型参数的约束时,我们必须将class()放在前面,将new()放在末尾。 为什么这样,为什么我不能按任何顺序放置约束? 除了class / struct之外,还有其他任何限制,最后是new()吗? 例: protected T Clone() where T : class, ICopyable, new()

如何约束generics类型必须有一个带有某些参数的construtor?

我有一个包装器generics类,旨在与一组类型一起使用。 这些类型由实用程序生成,并且都是从基类ClientBase派生的。 虽然ClientBase只有一个默认构造函数,但所有生成的类型都有默认构造函数,构造函数则将字符串作为参数。 在包装器类的构造函数中,我使用带有字符串的构造函数实例化该类型的实例。 这是一个示例代码: public class ClientBase { } public class GenericProxy where T: ClientBase, new() { T _proxy; public GenericProxy(string configName) { _proxy = new T(configName); } } 此代码无法编译,因为不保证类型T具有接受字符串的构造函数。 有没有办法在generics类上定义约束来强制类型T必须有一个带字符串的构造函数? 如果这是不可能的,那么处理这种情况的好方法是什么?

为什么这个generics约束在它似乎有一个循环引用时编译

我在csharp中为MVCContrib Html帮助器编写了一个扩展方法,并对通用约束的forms感到惊讶,从表面看它通过类型参数循环引用自身。 据说这种方法可以根据需要进行编译和工作。 我希望有人解释为什么这有效,如果存在更直观的直观语法,如果没有人知道为什么? 这是编译和function代码,但我删除了T的例子,因为它使问题蒙上阴影。 以及使用List 的类似方法。 namespace MvcContrib.FluentHtml { public static class FluentHtmlElementExtensions { public static TextInput ReadOnly(this TextInput element, bool value) where T: TextInput { if (value) element.Attr(“readonly”, “readonly”); else ((IElement)element).RemoveAttr(“readonly”); return element; } } } /*analogous method for comparison*/ public static List AddNullItem(this List list, bool value) where T : List { […]

限制generics类型参数以具有特定构造函数

我想知道为什么generics类型参数的新约束只能在没有参数的情况下应用,也就是说,可以将类型约束为具有无参数构造函数,但是不能将类约束为具有(例如)构造函数的构造函数。接收一个int作为参数。 我知道这方面的方法,使用reflection或工厂模式,工作正常,好吧。 但我真的很想知道为什么,因为我一直在思考它,我真的想不出无参数构造函数和带有参数的区别,这些参数可以certificate对新约束的这种限制。 我错过了什么? 非常感谢 论点1:构造函数是方法 @Eric:让我和你在一起一会儿: 构造函数是方法 然后我想如果我这样做,没有人会反对: public interface IReallyWonderful { new(int a); string WonderMethod(int a); } 但是一旦我有了,那我就去: public class MyClass where T : IReallyWonderful { public string MyMethod(int a, int b) { T myT = new T(a); return myT.WonderMethod(b); } } 这首先是我想要做的。 所以,抱歉,但不, 构造函数不是方法 ,或者至少不完全。 关于实现这个function的困难,我真的不知道,即使我这样做了,我对于明智地支出股东资金的决定也没什么可说的。 这样的话,我会马上把它标记为答案。 从学术(我)的角度来看,也就是说,没有任何关于实施成本的问题,问题确实是(我在最近几个小时内完成了这个问题): 构造函数应该被视为类的实现的一部分,还是作为语义契约的一部分(以同样的方式将接口视为语义契约)。 如果我们将构造函数视为实现的一部分,那么,约束generics类型参数的构造函数不是一件非常通用的事情,因为这会将您的generics类型绑定到具体的实现,并且几乎可以说为什么完全使用generics? 构造函数的示例作为实现的一部分(在将指定任何以下构造函数作为ITransformer定义的语义协定的一部分时没有意义): public […]

你能用“where”来要求c#中的属性吗?

我想创建一个只接受可序列化类的generics类,可以用where约束来完成吗? 我正在寻找的概念是这样的: public class MyClass where T : //[is serializable/has the serializable attribute]

奇怪的重复模板模式和generics约束(C#)

我想在基类generics类中创建一个方法来返回派生对象的专用集合并对它们执行一些操作,如下例所示: using System; using System.Collections.Generic; namespace test { class Base { public static List DoSomething() { List objects = new List(); // fill the list somehow… foreach (T t in objects) { if (t.DoSomeTest()) { // error !!! // … } } return objects; } public virtual bool DoSomeTest() { return true; } } class […]

我可以使用+运算符的通用约束吗?

是否有一些“where”类型的约束可以添加以使下面的代码编译? public class Plus : BinaryOperator where T : … { public override T Evaluate(IContext context) { return left.Evaluate(context) + right.Evaluate(context); } } 谢谢 :)