首先,我对SO和有关协变和逆变和一个大感谢博客出去看了很多解释埃里克利珀用于生产在这样一个伟大的系列赛协变和逆变.
但是我有一个更具体的问题,我试图让我的头脑稍微偏执一点.
据我所知,根据埃里克的解释,协方差和反方差都是描述转换的形容词.协变变换是保留类型顺序的变换,逆变变换是逆转变换的变换.
我理解协方差,我认为大多数开发人员直观地理解.
//covariant operation
Animal someAnimal = new Giraffe();
//assume returns Mammal, also covariant operation
someAnimal = Mammal.GetSomeMammal();
Run Code Online (Sandbox Code Playgroud)
这里的返回操作是协变的,因为我们保留了动物仍然比哺乳动物或长颈鹿大的大小.在这方面,大多数返回操作都是协变的,逆变操作是没有意义的.
//if return operations were contravariant
//the following would be illegal
//as Mammal would need to be stored in something
//equal to or less derived than Mammal
//which would mean that Animal is now less than or equal than Mammal
//therefore reversing the relationship
Animal someAnimal = Mammal.GetSomeMammal();
Run Code Online (Sandbox Code Playgroud)
这段代码当然对大多数开发人员没有意义.
我的困惑在于Contravariant参数参数.如果你有一个方法,如
bool Compare(Mammal mammal1, Mammal …
Run Code Online (Sandbox Code Playgroud) 哪个会更快?
bool same=(Guid)Identifier==id;
bool same=String.Equals(string1,string2, StringComparison.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud) 只是好奇,MSDN说
调用此方法始终会抛出InvalidCastException.
那么为什么框架中存在这种过载?它是否遵循某种模式?我假设为了向后兼容性,最好删除重载并接收编译错误而不是运行时异常.我不记得在以前的框架中是否实际支持这种方法.
我有一个Model类的集合,我不想将每个类单独映射到View Model类.
我可以使用Parallel.ForEach
或者ParallelEnumerable.ForAll
,那么2,如果有的话有什么区别?
我在MSDN上找不到任何东西.
我有一个XML,我需要从中删除空元素.我试图避免使用DOM,并尝试将其作为流.我有这个代码,但我不完全确定这是多么正确和优化.
StringBuilder xslt = new StringBuilder();
xslt.Append(@"<?xml version=""1.0"" encoding=""UTF-8""?>");
xslt.Append(@"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">");
xslt.Append(@"<xsl:output method=""xml"" version=""1.0"" encoding=""UTF-8"" indent=""yes""/>");
xslt.Append(@"<xsl:template match=""*"">");
xslt.Append(@"<xsl:if test=""count(@*) > 0 or count(node()) > 0"">");
xslt.Append(@"<xsl:copy>");
xslt.Append(@"<xsl:apply-templates select=""@* | node()""/>");
xslt.Append(@"</xsl:copy>");
xslt.Append(@"</xsl:if>");
xslt.Append(@"</xsl:template>");
xslt.Append(@"<xsl:template match=""@* | text()"">");
xslt.Append(@"<xsl:copy/>");
xslt.Append(@"</xsl:template>");
xslt.Append(@"</xsl:stylesheet>");
StringBuilder resultString = new StringBuilder();
XmlTextWriter xmlWriter = new XmlTextWriter(new StringWriter(resultString));
XmlTextReader xmlReader = new XmlTextReader(new StringReader(xmlString));
System.Xml.Xsl.XslCompiledTransform xslTransform = new System.Xml.Xsl.XslCompiledTransform();
xslTransform.Load(new XmlTextReader(new StringReader(xslt.ToString())));
xslTransform.Transform(xmlReader, xmlWriter);
xmlReader.Close();
xmlWriter.Flush();
xmlWriter.Close();
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法吗?