这是从编译器内部角度提出的问题。
我对泛型感兴趣,而不是模板(C++),所以我用C#标记了这个问题。而不是Java,因为AFAIK两种语言中的泛型在实现上有所不同。
当我查看语言w/o泛型时,它非常简单,您可以验证类定义,将其添加到层次结构中,仅此而已。
但是如何处理泛型类,更重要的是如何处理对它的引用呢?如何确保每个实例化的静态字段都是单数(即每次解决泛型参数时)。
假设我看到一个电话:
var x = new Foo<Bar>();
我是否向层次结构中添加了新的Foo_Bar类?
更新:到目前为止,我只发现了两篇相关的文章,然而,即使它们在“如何自己做”的意义上也没有太多的细节
在C++中,您可以从模板参数调用方法,如下所示:
template<class T> class foo
{
T t;
t.foo();
}
但在C#中,这看起来是不可能的:
class foo<T>
{
T t;
public void foo() {
t.foo(); // Generates a compiler error
}
};
我想这在C#中可能是不可能的,不是吗?
Basic C#语法问题:
所以我有这门课
public class BrandQuery<T> : Query<T> where T : Ad
{
//...
}
我如何指定BrandQuery实现一个接口,比如IDisposable?
这显然是错误的方式:
public class BrandQuery<T> : Query<T> where T : Ad, IDisposable
{
//...
}
因为这只会对T.
我在一个C#项目中有一个方法,如下所示
public T AddEC<T>() where T : EntityComponent, new() {
if (!HasEC<T>())
{
T nComponent = new T();
}
}
现在,我最近才开始正确地使用Java泛型,但我不知道如何移植这样的方法,或者由于语言限制,是否有可能,有人能帮助我吗?
是否可以使用C#泛型来替换这4个例程?
int memcmp (string a, string b){...}
int memcmp (string a, byte[] b){...}
int memcmp (byte[]a, string b){...}
int memcmp (byte[]a, byte[] b){...}
我试过很多不同的方法,但无法确定具体使用什么.
例如..。
int memcmp<A, B>( A a, B b)
{
if ( a.Length < b.Length ) return 1;
for ( int i = 0 ; i &
我正在尝试编写一个泛型函数,如下图所示。这个想法是有一个方法,它将接收一个泛型类型,它必须继承一个抽象类,这个抽象类具有一个具有另一个抽象类的泛型配置。
public class MainCode
{
public MainCode()
{
Execute<DefaultOptions>();
}
public void Execute<T>() where T : BaseClassOptions<BaseClassConfiguration> { }
}
public class DefaultOpti
在Andrew Tolson的Pro中,作者说当非泛型类扩展泛型基类时,派生类必须指定C#参数。
// Assume you have created a custom
// generic list class.
public class MyList<T>
{
private List<T> listOfData = new List<T>();
}
// Non-generic classes must specify the type
// parameter when deriving from a
// generic base class.
我有一个名为CAR的对象,声明如下:
public class Car{
public int NumberOfWheels;
}
使用另一个类,我可以检索它的三个子类。
如下所示:
public TruckA getCarA(int param){
return new TruckA () {NumberOfWheels = param}
}
public TruckB getCarB(int param){
return new TruckB () {NumberOfWheels = param}
}
public TruckC getCarC(int param
协变性是关于接受价值的吗?
我正在通过C#通过C#书籍学习。我看到了以下节选:
由于T是协变的,所以有可能编译并成功运行以下代码:
// This method accepts an IEnumerable of any reference type
Int32 Count(IEnumerable<Object> collection) { ... }
...
// The call below passes an IEnumerable<String> to Count
Int32 c = Count(new[] { "Grant" });
假设我有一个泛型类Foo<T>。
我想要做的是为各种T中的每一个创建一个singleton,然后在以后通过T快速检索它们。
在伪代码中
STORE new Foo<int>
STORE new Foo<MyClass>
GET instance for MyClass -> returns the Foo<MyClass> created above.
在Java语言中,我会创建一个键为Type,值为Foo<*>的字典。
在C#中等效的魔术是什么?
我在这有个小问题。我使用的是泛型类,但在从UI窗格中选择之前,我不知道类型。在知道对象的类型之前,我如何声明它?这是样本
public class UI
{
Agent myAgent;
public UI()
{
}
public void Initialize()
{
if (textBox1.Text == "LabAgent")
myAgent = new Agent<LabState, LabAction>();
else
myA
当涉及到如何使泛型在C#中工作时,我有一个小问题:
我有以下课程:
public abstract class OphControl<TDataModel> : Control
where TDataModel : OphDataModel, new()
{
/// <summary>
/// The data model for this control.
/// </summary>
public TDataModel DataModel { get; private set; }
public IEn
我想扩展我的BinaryTree类,以便只接受整型参数,并且可以重用代码。
public class BinaryTree<T extends Comparable<T>>
{/*code omitted for convenience*/}
public class BinaryTreeInt<T extends Integer> extends BinaryTree<T>
{/*code omitted for convenience*/}
我在编译时遇到以下错误-
BinaryTreeInt.java:1: type param
这可能是一个简单的,但我的头脑拒绝包装,所以外部视图总是有用的情况下!
我需要设计一个对象层次结构来实现对病人的参数注册。这将在某一特定日期发生,并收集有关病人的许多不同参数(血压、心脏痛等)。这些参数注册的值可以是不同类型的,例如字符串、整数、浮点数甚至guids (用于查找列表)。
所以我们有:
public class ParameterRegistration
{
public DateTime RegistrationDate { get; set; }
public IList<ParameterRegistrationValue> ParameterRegis
我已经创建了一个泛型类:
public abstract class MyClass<T>
{
public T Model
{
get;
protected set;
}
}
在我的代码中的某个地方,我想对任何MyClass类型的东西做一些事情。类似于:
private void MyMethod(object param)
{
myClassVar = param as MyClass;
param.Model....etc
}
这个是可能的吗?或者我需要让MyClass成为某个东西的子类(
在Java中,您可以编写一个将集合中的每个List反转的静态方法:
public static void reverseAll(Collection<List<?>> lists) {
for (List<?> list : lists)
Collections.reverse(list);
}
当我试图在C#中执行类似的操作时,我遇到了困难,因为接口IList<T>随着T的变化而变化,不能与Reverse方法共享公共接口。我发现您可以使用dynamic类型来完成这个任务:
public static void Rever
我有一个generic class GenericClass<T>,因为某种原因,我需要从另一个类型传递泛型类型,比如:
假设我有一些classes,从NormalClass1到NormalClassN,所有这些都有属性,比如prop1和不同的types,我需要这样做
var type1 = typeof(NormalClass1).GetProperty("prop1").GetType();
并将type1发送到GenericClass的新实例,如下所示:
var instance = new GenericClass<type1>();
但是出现
我们可以将类的type属性限制为特定的类型吗?
例如:
public interface IEntity { }
public class Entity : IEntity {}
public class NonEntity{}
class SampleControl {
public Type EntityType{get;set;}
}
假设sampleControl是UI类(可以是控件、窗体、..)它的EntityType属性值应该只接受typeof(实体)的值,而不接受typeof(NonEntity)的值。我们如何才能限制用户在设计时给出特定的类型(因为Sample是我
我正在用C#编写一个类库,用于处理矩阵,并且目前正在处理一个名为ComplexMatrix的矩阵子类。矩阵基类处理Int32数据类型的值(更高级的版本使用Double),以及System.Numerics.Complex结构的ComplexMatrix (.NET 4)。
对于基类,我将ToString()重写为:
| 1 2 |
| 3 4 | printed as {{1,2}{3,4}}
System.Numerics.Complex结构覆盖表单中的ToString():
a+bi printed as (a,b) where a is real and b
我正在将一些Java代码移植到C#上,并且在复制这种行为时遇到了困难:
* JAVA代码*
public abstract class Fruit<T extends Fruit>{
//Fruit implementation
}
这很好,因为我只想要扩展果树的泛型类型。然后,我可以为所有的混凝土水果对象存储引用,如下所示:
Banana banana = new Banana(); //This class extends Fruit
Strawberry strawberry = new Strawberry (); //This class extends Fruit
文档化的派生约束使用了一个where T :子句,我正在修改的示例代码是
public class TwoThingsIPC<T> where T : IPassClass
{ ...
}
其中IPassClass是一个接口。
来自我正在使用的第三方的代码具有以下格式
public class TwoThingsIPC<IPassClass>
{ ...
}
这两者在我的代码中都会导致相同的行为,但它们是相同的吗?如果不是的话,有什么区别呢?
我是泛型班的新手。我现在在做游戏。我会有很多敌人,它们都是从一个通用的EnemyBase类继承的
public abstract class EnemyBase<TState, TTransition>
{
protected StateMachine<TState, TTransition> m_FSM;
}
举个例子,我会有这样的例子:
public class EnemySquire : EnemyBase<EnemySquire.State, EnemySquire.StateTransition>
{
public enum St
我有这个C#类结构,我想重构它以使用最好的编码标准(使用接口/抽象类),这样它就更容易维护和重用。现在的代码不是很糟糕,但也不是很理想。
我有一系列的TableItemGroup类: AccountTableItemGroup、PendingVoteTableItemGroup和RequestingVoteTableItemGroup。每个TableItemGrup包含一个字符串SectionName和一个对应TableItem ...as的列表,如下所示:
public class AccountTableItemGroup {
public string SectionName {
我正在开发一个C#控制台应用程序。我的目标是创建一个名为GroupEntity的对象,最好是非泛型的。
在这个GroupEntity对象中将有一个'AttributeFilter‘对象的列表,它包含泛型类型的对象,该对象保存Active中的用户对象的属性名和这些用户对象的可能值。我希望AttributeFilter对象采用泛型类型的原因是,AD中用户对象上的一些属性是string,有些是int32,有些是int64等等。
这是我的课程(为了节省空间,我已经删掉了构造器等)
public class AttributeFilter<T> : IEqualityComp