首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.Net c#一般问题

.Net c#一般问题
EN

Stack Overflow用户
提问于 2009-12-09 08:53:31
回答 4查看 165关注 0票数 1

下面是一个示例:

代码语言:javascript
运行
复制
public class B<T> {}
public class D : B<int> {}
public class A<T, S> where T : B<S> {}
public class C : A<D, int> {}

public class Test1
{
    public class test1
    {
        A<D, int> t = new C();
    }
}

我想要做的是声明C类,只说:C : A<D>。为什么我需要重复int?因为int已经是D的一部分。

test1方法也是如此。我想写:A<D> t = new C()

我怎样才能做到这一点呢?

更新

这里使用更真实的类名:

代码语言:javascript
运行
复制
public class MyModel<T> { }
public class MyTrueModel : MyModel<int> { }

public class MyManager<T,S> where T : MyModel<S> { }
public class MyTrueManager : MyManager<MyTrueModel, int> { }

public class Test1
{
    public class test1
    {
        MyManager<MyTrueModel, int> t = new MyManager<MyTrueModel, int>();
    }
}

所有的问题都来自于MyManager类。如果我能做这样的事情:MyManager<T> where T : MyModel,那就太好了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-09 09:38:16

下面是你的代码:

代码语言:javascript
运行
复制
public class B<T> {}
public class D : B<int> {}
public class A<T, S> where T : B<S> {}
public class C : A<D, int> {}
public class Test1 {
    public class test1 {
        A<D, int> t = new C();
    }
}

下面是等价的代码:

代码语言:javascript
运行
复制
public class B<T> {}
public class D : B<int> {}
public class A<U, V> where U : B<V> {}
public class C : A<D, int> {}
public class Test1 {
    public class test1 {
        A<D, int> t = new C();
    }
}

关键是A<U, V>中的U是一个虚拟对象。当您将U替换为T (将V替换为S)并编写A<T, S>时,TB<T>中不引用相同的T。这就是您必须使用C : A<D, int>的原因。如果您只编写A<D>,编译器不知道(也不应该知道;请参阅我下面关于自由变量与非绑定变量的注释),您希望在B<T>中为T使用int

所有的问题都来自类MyManager。如果我能在T : MyModel的地方做一些像: MyManager<T>这样的事情,那就太好了。

这是不可能的。MyModel未声明为类型。只有MyModel<T>是一个类型。更具体地说,它是一个无界泛型类型。当您指定一个类型参数(例如,MyModel<int>)时,它将是一个构造类型。

冒着进一步迷惑您的风险(在这个公认令人困惑的问题上),它可能会帮助您阅读有关free and unbounded variables的知识。

票数 3
EN

Stack Overflow用户

发布于 2009-12-09 09:02:00

也许我误解了你的问题。但是如果你不需要int。只需使用D即可。

代码语言:javascript
运行
复制
public class B<T> { }
public class D : B<int> { }
public class A<T> where T : D { }
public class C : A<D> { }
public class Test1 { public class test1 { A<D> t = new C();    } }
票数 0
EN

Stack Overflow用户

发布于 2009-12-09 09:04:16

A<D> t = new C();不会工作,因为您之前已经声明了A需要两个泛型参数。

您可以声明如下内容:

代码语言:javascript
运行
复制
class A2<T> : A<T, int> {}

然后(我认为)你可以实现A2<D> t = new C();,但我假设编译器足够聪明,能够意识到A2与C……可能不是。

这是一个实验吗?看起来你可能很难弄清楚6个月后(甚至2个月后)这应该做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1870962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档