这是CLR的限制还是现有代码存在兼容性问题?
这与C#4.0中委托合并的混乱变化有关吗?
编辑:如果没有在CLR上运行的限制,是否可以使用使用共同/逆变的语言?
只是一个想法.
在C#中使用可选类型参数不是很有用吗?
这会让生活更简单.我厌倦了多个具有相同名称但类型参数不同的类.另外VS不支持这个非常vell(文件名):-)
例如,这将消除对非通用IEnumerable的需求:
interface IEnumerable<out T=object>{
IEnumerator<T> GetEnumerator()
}
Run Code Online (Sandbox Code Playgroud)
你怎么看?
只是好奇:当然,我们都知道泛型类型推断的一般情况是不可判定的.所以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月)
新的.NET 4.0泛型类型参数的协同和逆变仅适用于接口和委托.不支持课程的原因是什么?
我有一个抽象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'错误.
为什么这不起作用?
让我们假设我们有两个类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# ×6
generics ×5
c#-4.0 ×3
covariance ×3
.net ×1
clr ×1
inference ×1
oop ×1
polymorphism ×1
types ×1