相关疑难解决方法(0)

为什么C#4.0中的类没有通用方差?

如果我们有接口,为什么我们也没有它用于类?使用它时会产生什么问题?

.net c# generics c#-4.0

55
推荐指数
1
解决办法
4119
查看次数

为什么C#4.0的协方差/逆变仅限于参数化接口和委托类型?

这是CLR的限制还是现有代码存在兼容性问题?

这与C#4.0中委托合并的混乱变化有关吗?

编辑:如果没有在CLR上运行的限制,是否可以使用使用共同/逆变的语言?

c# clr covariance contravariance c#-4.0

11
推荐指数
2
解决办法
618
查看次数

那么C#5.0中的可选泛型类型参数呢?

只是一个想法.

在C#中使用可选类型参数不是很有用吗?

这会让生活更简单.我厌倦了多个具有相同名称但类型参数不同的类.另外VS不支持这个非常vell(文件名):-)

例如,这将消除对非通用IEnumerable的需求:

interface IEnumerable<out T=object>{
  IEnumerator<T> GetEnumerator()
}
Run Code Online (Sandbox Code Playgroud)

你怎么看?

c# generics

8
推荐指数
1
解决办法
5477
查看次数

为什么C#不对泛型做"简单"类推理?

只是好奇:当然,我们都知道泛型类型推断的一般情况是不可判定的.所以C#根本不做任何类型的子类型:如果Foo <T>是泛型的,Foo <int>不是Foo <T>的子类型,或Foo <Object>或其他任何你可能的类型做饭.当然,我们都用丑陋的界面或抽象类定义来解决这个问题.

但是......如果你无法解决一般性问题,为什么不将解决方案限制在容易的情况下.例如,在上面的列表中,显然Foo <int>Foo <T>的子类型,并且检查它是微不足道的.检查Foo <Object>是一样的.

如果他们只是说,那么还有其他一些深深的恐怖会从深渊蔓延出来,我们会尽我们所能吗?或者这只是微软语言人员的某种宗教纯洁?


更新:

这是一个非常古老的线程.这些天,C#有var,它解决了我抱怨的一半,然后使用Linq风格的匿名代表,有一个很好的表示法,不需要输入两次相同的东西.因此,我反对的每一个方面都已经通过最近对C#的更改得到了解决(或者我只是花了一些时间来了解我刚发布帖子时刚刚介绍的内容......)我使用这些新内容现在在Isis2系统中可靠的云计算功能(isis2.codeplex.com),我认为该库具有非常干净的外观和感觉.看看它,让我知道你的想法). - Ken Birman(2014年7月)

c# generics types inference covariance

4
推荐指数
2
解决办法
689
查看次数

3
推荐指数
1
解决办法
1221
查看次数

无法将通用类的子类添加到列表中

我有一个抽象Content类和具体的子类

public abstract class Content

public class ContentA : Content

public class ContentB : Content
Run Code Online (Sandbox Code Playgroud)

我还有一个抽象的泛型ContentSource类和具体的子类

public abstract class ContentSource<T> where T : Content

public class SourceX : ContentSource<ContentA>

public class SourceY : ContentSource<ContentB>
Run Code Online (Sandbox Code Playgroud)

我希望有一个ContentSource<Content>对象列表作为子类ContentSource

var ContentSources = new List<ContentSource<Content>>
{
    new SourceX(),
    new SourceY(),
};
Run Code Online (Sandbox Code Playgroud)

但这不编译 - 我得到一个'无法从SourceX转换为ContentSource'错误.

为什么这不起作用?

c# generics

3
推荐指数
1
解决办法
104
查看次数

为什么派生类的泛型会产生非派生类?

让我们假设我们有两个类A,B其中B来自A.

class A
{
}

class B : A
{
}

class C<T>
{
}
Run Code Online (Sandbox Code Playgroud)

现在,C<B> 不获得C<A>.

这让我有点困惑,因为我强调我用A做的"一切",我可以用B做.我确信我错过了一些东西,因为它似乎与OOP的基础相矛盾.

那有什么具体的理由和榜样吗?

编辑:

我读过许多类似的帖子: 在C#中,为什么List <string>对象不能存储在List <object>变量中

当值类型可以相互转换时,为什么我不能将一个值类型的字典转换为另一个值类型的字典?

从IEnumerable <Object>转换为IEnumerable <string>

但是在每个帖子中,答案都集中在特定的类/数据结构中,并使这个特定的代码工作,而不是为什么它一般不可能?

c# oop generics polymorphism

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

标签 统计

c# ×6

generics ×5

c#-4.0 ×3

covariance ×3

contravariance ×2

.net ×1

clr ×1

inference ×1

oop ×1

polymorphism ×1

types ×1