相关疑难解决方法(0)

对约束泛型类型参数的继承

我知道不可能从泛型类型参数继承,但是在为抽象类型的衍生物实现公共代理时它会很方便:-)

有谁知道为什么这是不可能的?

示例C#:

abstract class Foo
{
  public virtual void Bar()
  {
     // nop
  }
}

class FooProxy<TFoo> : TFoo
  where TFoo : Foo
{

  public override void Bar()
  {
    // do some stuff before
    base.Bar();
    // do some stuff after
  }

}
Run Code Online (Sandbox Code Playgroud)

编辑:一些代码来说明如何使用它的示例.考虑以下Foo的衍生物:

class FooX : Foo
{
  public string X { get; set; }
  public override void Bar()
  {
    Console.WriteLine("Doing Bar X");
  }
}

class FooY : Foo
{
  public string Y { get; set; }
  public override …
Run Code Online (Sandbox Code Playgroud)

c# generics

27
推荐指数
2
解决办法
3万
查看次数

在C#4.0中,是否可以从泛型类型参数派生类?

我一直在尝试这个,但我似乎无法解决这个问题.我想做这个...

public abstract class SingletonType<TSingleton, TBaseClass> : TBaseClass
    where TSingleton : TBaseClass, new()
    where TBaseClass : class
{
    static TSingleton _singleton;
    public static TSingleton Singleton
        => _singleton ?? (_singleton = new TSingleton());
}
Run Code Online (Sandbox Code Playgroud)

计划是像这样使用它,它可以在基类周围"包裹"单例模式......

public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}
Run Code Online (Sandbox Code Playgroud)

但是,我一直这样做

无法从'TBaseClass'派生,因为它是一个类型参数

嗯...我想类型为你到底是什么的派生!

那我错过了什么?

注意:这当然是一个简单的例子,因为它没有添加任何有用的东西,但是假设SingletonType有许多其他逻辑与问题无关,因此忽略了关注手头的问题.

c# generics inheritance subclass derived-class

24
推荐指数
2
解决办法
1万
查看次数

希望.NET泛型可以继承其中一个泛型参数类型的理由是什么?

这篇文章是在延续这一个.

我试图了解我是否是唯一一个错过并需要.NET泛型类型的人才能继承其通用参数类型的人.

挑战是收​​集有利于此功能的令人信服的理由,或者,知道没有.

我有理由把它作为这个问题的答案 - 见下文.

我要求那里的人添加他们作为这篇文章的答案.

如果你不同意这个功能是有用的或者没有充分的理由支持 - 请不要在这里发布任何内容,尽管你可以在已经启动它的原始帖子中这样做 - 在这里.

PS

一些C++模式在.NET中无关紧要.例如,在他的优秀书籍Modern C++ Design中, Andrei Alexandrescu描述了如何创建在编译时评估的类型列表.当然,这种模式与.NET无关,如果我需要一个类型列表,我只需创建List<Type>并用类型填充它.因此,让我们尝试提出与.NET框架相关的原因,而不是盲目地将C++编码技术转换为C#.

PPS

当然,这个讨论严格来说是学术性的.即使有问题的一百个令人信服的理由浮出水面,它也不会被实施.

.net generics

16
推荐指数
2
解决办法
1571
查看次数

C#中的泛型继承?

可能重复:
为什么C#泛型不能像C++模板中那样从泛型类型参数中派生出来?

我可以

public class MyGenericClass : DL
//but i cannot do
public class MyGenericClass <T> : T
Run Code Online (Sandbox Code Playgroud)

我怎么做第二个?如果我不能那样做,我该怎么办呢

public class MyGenericClass <T> 
{
    T obj;
    //have all MyGenericClass.XYZ call obj.XYZ
}
Run Code Online (Sandbox Code Playgroud)

c# generics inheritance

11
推荐指数
3
解决办法
3万
查看次数

冗余通用约束?

请考虑以下通用方法:

public T2 Frob<T1, T2>(T1 item)
        where T1 : class, T2
        => item as T2;
Run Code Online (Sandbox Code Playgroud)

编译器将拒绝编译此代码; 类型参数'T2'不能与'as'运算符一起使用,因为它没有类类型约束,也没有'class'约束

好的,这很容易解决,只需:

public T2 Frob<T1, T2>(T1 item)
        where T1 : class, T2
        where T2 : class
        => item as T2;
Run Code Online (Sandbox Code Playgroud)

但这不是多余的吗?有没有可能T2class考虑已经存在的限制T1

我的问题不是为什么这个"推理"没有在编译器中实现,原因可能只是"没有人想到它",那没关系.我更感兴趣的是,我知道我的推理是否正确,T2并且在所有情况下都限制class在第一个例子中,即使它没有明确强制执行.

c# generics type-constraints

10
推荐指数
1
解决办法
192
查看次数