Tag: generics

类型参数声明必须是标识符而不是类型

有一个基类有一个generics类型的方法,我相信在我的派生中我将返回一个字符串。 这是我的代码: public abstract class Base { public virtual T GetSomething() { return default(T); } } public class Extended : Base { public override string GetSomething() { return string.Empty; //return base.GetSomething(); } } 但是这段代码没有编译。 任何人都可以发现错误吗? 我确信在我的Extended类中我只想返回字符串。 我该如何解决这个问题?

引用我自己的类型的最佳方式

abstract class A where T:A { public event Action Event1; } class B : A { //has a field called Action Event1; } 有没有更优雅的方式来做到这一点? 我希望基类中的东西(事件等)能够使用子类的类型。

未针对动态generics类型解析方法

我有这些类型: public class GenericDao { public T Save(T t) { return t; } } public abstract class DomainObject { // Some properties protected abstract dynamic Dao { get; } public virtual void Save() { var dao = Dao; dao.Save(this); } } public class Attachment : DomainObject { protected dynamic Dao { get { return new […]

如何在C#中汇总通用数字?

可能重复: C#generics约束仅用于整数 正如您在下面的代码中看到的,我需要计算两个通用数字的总和。 public class NumberContainer { public T ValueA { get; private set; } public T ValueB { get; private set; } public T Total { get { return ValueA + ValueB; } } } 但是,不可能直接添加两个T值,这会导致编译器错误如下: 运算符’+’不能应用于’T’和’T’类型的操作数 鉴于我不打算将T用于表示数字(short,ushort,int,uint等)的值类型以外的任何其他内容,我怎么能执行总和呢? (效率是一个需要考虑的因素)

究竟谁最后决定什么是通用类型?

我有这个function public static T2 MyFunc( T1 a, T1 b, T2 c) { return c; } 我正在创建2个Persons类实例: class Person { } Person p = new Person(); Person p2 = new Person(); 我正在调用函数: MyClass.MyFunc(p, p2, 5); 我的问题是: 谁真正决定T1类型? (p?p2?) 因为如果左边是Apple,那么他会检查第二个是Apple也是苹果 如果第二个是橙色 – 他应该检查第一个是橙色。 在编译时问它是否会失败,如果不一样的话,这似乎很奇怪。 仍然 – 谁决定类型? 第二 – 如果我将其更改为动态 – 在运行时 – 谁将决定T1类型应该是什么?

T 。包含struct和class的行为方式不同

这是一个后续问题: List .Contains和T []。包含不同的行为 T[].Contains当T是类和结构时, T[].Contains的行为不同。 假设我有这个结构 : public struct Animal : IEquatable { public string Name { get; set; } public bool Equals(Animal other) //<- he is the man { return Name == other.Name; } public override bool Equals(object obj) { return Equals((Animal)obj); } public override int GetHashCode() { return Name == null ? […]

C#:是具有inheritance的generics类型的运算符

我有一个运算符比较generics类型的问题。 public interface ISomeInterface where T : SomeBaseClass{ } public class SomeClass : SomeBaseClass{ } 现在我们想用is运算符检查类型。 我们有一个实现接口ISomeInterface的类的实例。 不幸的是,我们面临以下问题: // someObject is an Instance of a class implementing interface ISomeInterface bool isSomeBaseClass = someObject is ISomeInterface; // false bool isSomeClass = someObject is ISomeInterface; // true 是否可以检查变量generics类型? 托比,提前谢谢

使用generics属性调用重载方法会调用错误的重载

我有一个基本的filter类,存储string参数名称和通用T值。 filter有一个方法Write(writer As IWriter) ,它将filter的内容写入HTML页面。 Write方法有两个重载,一个带两个字符串,它接受一个字符串和一个对象。 这让我自动引用字符串。 问题是,当我调用writer.Write(ParameterName, Value)而T是一个string ,它调用字符串/对象的重载,而不是字符串/字符串! 如果我直接在编写器上调用Write方法,它将按预期工作。 这是C#中的SSCE。 我在VB和C#中测试了这个,发现了同样的问题 void Main() { FooWriter writer = new FooWriter(); Filter f = new Filter() {ParameterName = “param”, Value = “value”}; f.Write(writer); //Outputs wrote w/ object writer.Write(f.ParameterName, f.Value); //Outputs wrote w/ string } class FooWriter { public void Write(string name, object value) { Console.WriteLine(“wrote […]

C#generics – 没有设计的下限?

我正在阅读Codehua at Work中对Joshua Bloch的采访,他在Java 5中对generics的介绍感到遗憾。他不喜欢具体的实现,主要是因为方差支持–Java的通配符 – 使得它不必要地复杂化。 据我所知,C#3没有明确的,有界的通配符,例如你不能声明一个方法PriceBatch,它接受一个Asset或任何Asset子类的void PriceBatch(Collection assets) ( void PriceBatch(Collection assets)在Java?)。 有谁知道为什么没有将通配符和边界添加到C#中? 故意遗漏这些function以使语言更简单,或者这是他们还没有实现的东西呢? 编辑:圣烟,Eric Lippert本人的评论! 在阅读了他和Paul的深刻见解之后,我意识到至少支持上限,并且上面的例子可以转换为C#: void PriceBatch(ICollection assets) where T : Asset 另一方面,显然不支持下限,因为Eric在他的第二条评论中说,例如,可能没有办法直接将这个(有点人为的)Java代码转换为C#: public class Asset {} public class Derivative extends Asset {} public class VanillaOption extends Derivative {} public static void copyAssets(Collection src, Collection dst) { for(T asset : src) […]

如何转发generics类型参数

当我在这种情况下使用reflection时,创建的类型可以是许多generics类型。 BaseStepHandler activator = (BaseStepHandler)Activator.CreateInstance(….); 创建的实例可以是BaseStepDataModel的所有子项。 BaseStepHandler OR BaseStepHandler OneDataModel和TwoDataModel正在扩展BaseStepDataModel。 这是我得到的例外: 无法将’…. GlobalOnBoardingStepOneHandler’类型的对象转换为’…. BaseStepHandler`1 […. BaseStepDataModel]’。 这是GlobalOnBoardingStepOneHandler的声明。 public class GlobalOnBoardingStepOneHandler : BaseStepHandler{}