Tag: duck typing

为什么集合初始化会引发NullReferenceException

以下代码抛出NullReferenceException : internal class Foo { public Collection Items { get; set; } // or List } class Program { static void Main(string[] args) { new Foo() { Items = { “foo” } // throws NullReferenceException }; } } 为什么收集initiliazers在这种情况下不起作用,虽然Collection实现了Add()方法,为什么抛出NullReferenceException? 是否可以使集合初始化程序工作,或者是Items = new Collection() { “foo” }初始化它的唯一正确方法?

LINQ“查询语法”是否支持Duck打字?

关于LINQ查询语法… var foo = new List { 1, 2 }; var boo = from n in foo where n > 1 select n; …我一直认为这种语法仅限于在IEnumerable上运行 。 或者至少在我了解IQueryable之前。 也许IObservable也许。 但我最近注意到一个建议,即查询语法基于duck typing 。 在我发现一个专门用于LINQ to Tasks的网站之前,这个故事看起来并不十分令人信服。 LINQ to Tasks看起来完全依赖于使用查询语法的duck typing ! 好的,这里发生了什么? 查询语法是否使用duck typing? 当我自己尝试一下时,确实这有效并且似乎certificate了所有关于鸭子打字,而不是IEnumerable: public class Joker { public T Item; public Joker(T item) { Item = […]

C#是否与Scala的结构类型相当?

在Scala中,我可以定义结构类型如下: type Pressable = { def press(): Unit } 这意味着我可以定义一个函数或方法,它将一个可压缩的参数作为参数,如下所示: def foo(i: Pressable) { // etc. 我传递给这个函数的对象必须为它定义一个名为press()的方法,它匹配类型中定义的类型签名 – 不带参数,返回Unit(Scala的void版本)。 我甚至可以使用结构类型内联: def foo(i: { def press(): Unit }) { // etc. 它基本上允许程序员拥有鸭子打字的所有好处,同时仍然具有编译时类型检查的好处。 C#有类似的东西吗? 我用谷歌搜索但找不到任何东西,但我不熟悉C#的任何深度。 如果没有,有没有计划添加这个?

如何在运行时在IEnumerable 上创建动态多属性Select?

我昨天问了一个非常相似的问题 ,但直到今天我才意识到我接受的答案并没有解决我所有的问题。 我有以下代码: public Expression<Func> SelectExpression(string fieldName) { var param = Expression.Parameter(typeof(TItem), “item”); var field = Expression.Property(param, fieldName); return Expression.Lambda<Func>(field, new ParameterExpression[] { param }); } 使用如下: string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single(); var primaryKeyExpression = SelectExpression(primaryKey); var primaryKeyResults = query.Select(primaryKeyExpression).ToList(); 这允许我从IQueryable提取主键。 问题是这段代码只适用于一个主键,我需要添加对多个PK的支持。 那么,有什么方法可以调整上面的SelectExpression方法来获取IEnumerable (这是我的主键属性名列表)并让方法返回一个选择这些键的表达式? 即给出以下内容: var knownRuntimePrimaryKeys = new string[] { “CustomerId”, “OrderId” }` 我的选择需要执行以下操作(在运行时): var […]

返回共享方法的两种不同类型的可能对象之一

我有2个class: public class Articles { private string name; public Articles(string name) { this.name = name; } public void Output() { Console.WriteLine(“The class is: ” + this.GetType()); Console.WriteLine(“The name is: ” + name); } } 和 public class Questionnaire { private string name; public Questionnaire(string name) { this.name = name; } public void Output() { Console.WriteLine(“The […]