Tag: generics

为什么直接转换失败但“as”运算符在测试约束generics类型时成功?

“编译一些使用带有类型约束的generics的C#代码时,我遇到了一个有趣的好奇心。 我写了一个快速测试用例来说明。 我在Visual Studio 2010中使用.NET 4.0。 namespace TestCast { public class Fruit { } public class Apple : Fruit { } public static class Test { public static void TestFruit(FruitType fruit) where FruitType : Fruit { if (fruit is Apple) { Apple apple = (Apple)fruit; } } } } 对Apple的强制转换失败并显示错误:“无法将类型’FruitType’转换为’TestCast.Apple’”。 但是,如果我更改行以使用as运算符,它将编译而不会出现错误: Apple apple = fruit […]

要求在FAIL上抛出特定exception类型的通用方法

是的,我知道我完全会看到这个人的白痴,但我的大脑今天早上并没有开始。 我希望有一种方法,我可以说“如果它变坏了,请回到这种类型的exception”,对吧? 例如,类似的东西( 这不起作用 ): static ExType TestException(string message) where ExType:Exception { Exception ex1 = new Exception(); ExType ex = new Exception(message); return ex; } 现在让我感到困惑的是,我们知道generics类型由于where子句而属于Exception类型。 但是,代码失败是因为我们无法隐式地将Exception 强制转换为ExType 。 我们也无法明确转换它,例如: static ExType TestException(string message) where ExType:Exception { Exception ex1 = new Exception(); ExType ex = (ExType)(new Exception(message)); return ex; } 因为那也失败了。那么这种事情可能吗? 我有一种强烈的感觉,它会变得非常简单,但是我和老头脑一起度过艰难的一天,所以让我有些松懈:P 更新 感谢回复的人,看起来我不是一个完全白痴! ;) […]

具有generics类型的C#属性

我上课了: public class class1 { public string Property1 {get;set;} public int Property2 {get;set;} } 哪个将被实例化: var c = new class1(); c.Property1 = “blah”; c.Property2 = 666; 所以忍受我(我是generics的新手),我需要另一个具有generics类型属性的类,以便可以使用Property1或Property2来设置Property3: public class Class2 { public GenericType Property3 {get;set;} } 我希望能够: var c2 = new class2(); c2.Property3 = c1.Property2 // Any property of any type.

接口声明与通用约束一起使用

基本的C#语法问题: 所以我有这门课 public class BrandQuery : Query where T : Ad { //… } 如何指定BrandQuery实现一个接口,比如IDisposable? 这显然是错误的方式: public class BrandQuery : Query where T : Ad, IDisposable { //… } 因为这只会对T提出一般约束

具有未知数量参数的Func

请考虑以下伪代码: TResult Foo(Func f, params object[] args) { TResult result = f(args); return result; } 该函数接受具有未知数量的generics参数的Func和相应参数的列表。 是否可以用C#编写? 如何定义和调用Foo ? 如何将args传递给f ?

NUnit的Is.Equal对于从generics类派生的类不能可靠地工作吗?

今天我遇到了NUnit的以下问题。 我有一个类,派生自generics类。 我开始做一些序列化测试,并使用NUnit的Is.EqualTo()函数测试相等性。 当一个应该失败的测试通过时,我开始怀疑出现了问题。 当我使用obj1.Equals(obj2)而不是它应该失败时。 为了调查我创建了以下测试: namespace NUnit.Tests { using Framework; public class ThatNUnit { [Test] public void IsNotEqualTo_ClientsNotEqual_Passes() { var client1 = new DerrivedClient(); var client2 = new DerrivedClient(); client1.Name = “player1”; client1.SomeGenericProperty = client1.Name; client2.Name = “player2”; client2.SomeGenericProperty = client2.Name; Assert.That(client1.Equals(client2), Is.False); Assert.That(client1, Is.Not.EqualTo(client2)); } [Test] public void IsNotEqualTo_ClientsAreEqual_AlsoPasses_SomethingWrongHere() { var client1 = […]

如何将对象的类型与generics类型进行比较,与generics参数无关?

说明我的问题的最好方法是使用此示例代码: class Item {} class Container {} class Program { static void DoSomething( object something ) { if( typeof( Item ) == something.GetType() ) { System.Console.WriteLine( “Item” ); } else if( typeof( Container ) == something.GetType() ) { System.Console.WriteLine( “Container” ); } } static void Main( string[] args ) { DoSomething( new Item() ); DoSomething( […]

C#转换inheritance的通用接口

我遇到了一些麻烦,让我开始构建一个我想出的界面。 这是C#Windows Forms的MVP设计。 我有一个IView类,我在我的表单类上实现。 还有一个IPresenter,我将其导入各种特定的演示者。 每个Presenter将根据角色以不同方式管理IView,例如打开对话框以使用AddPresenter输入新数据集,而不是使用EditPresenter编辑现有数据,EditPresenter会将数据预加载到表单上。 每个都inheritance自IPresenter。 我想这样使用代码: AddPresenter pres = new AddPresenter(); 我基本上有这个工作,但这些演示者和他们管理的视图被捆绑到运行时加载的插件,这意味着我需要一个作为插件接口的Manager类采用“模式”参数。 此模式参数用于工厂方法来创建“添加”或“编辑演示者”,但由于稍后会调用显示对话框,因此我需要通过IPresenter接口进行调用,如下所示: private IPresenter pres; public ShowTheForm() { pres.ShowDialog(); } 现在,我遇到的问题是将AddPresenter的具体实例表示为’pres’成员。 这是我所拥有的简化版本: interface IView { void ViewBlah(); } interface IPresenter where V : IView { void PresBlah(); } class CView : IView { public void ViewBlah() { } } class CPresenter : […]

C#Generics – 如何返回特定类型?

也许我说这一切都错了。 我有一堆派生自“Model”类的类,一个带有一堆常见属性和方法的基类。 我希望他们都实现一组function: public abstract void Create(); public abstract T Read(Guid ID); //<–Focus on this one public abstract void Update(); public abstract void Delete(); 然后我在像“约会”这样的子类中实现它,如下所示: public override T Read(Guid ID) { var appt = db.Appointments.First(a => a.AppointmentID.Equals(ID)); var appointment = new Appointment() { DateEnd = appt.dateEnd.GetValueOrDefault(), Location = appt.location, Summary = appt.summary }; return appointment; […]

.Net是否支持curried的generics?

假设我们有一个嵌套的generics类: public class A { public class B { } } 这里, typeof(A.B)本质上是一个具有两个参数的generics类,其中只有第一个被绑定。 如果我有一个带有两个参数的单个类 public class AB { } 有没有办法引用“ AB与T=int和U保持开放”? 如果不是,这是C#限制还是CLR限制?