Tag: type in​​ference

C#中的“var”类型推断

可能重复: 为什么var在“foreach(table.Rows中的var row)”中评估为System.Object? 今天发现以下内容我感到非常惊讶…. SqlDataReader reader = cmd.ExecuteReader(); DataTable schemaTable = reader.GetSchemaTable(); // the following compiles correctly foreach (DataRow field in schemaTable.Rows) { Console.WriteLine(field[“ColumnName”]); } // the following does not compile as ‘var’ is of type ‘object’ foreach (var field in schemaTable.Rows) { // Error: Cannot apply indexing with [] to an expression of type […]

重载,generics类型推断和’params’关键字

我刚注意到一个带有重载决策的奇怪行为。 假设我有以下方法: public static void DoSomething(IEnumerable items) { // Whatever // For debugging Console.WriteLine(“DoSomething(IEnumerable items)”); } 现在,我知道这个方法通常会使用少量显式参数调用,所以为方便起见,我添加了这个重载: public static void DoSomething(params T[] items) { // Whatever // For debugging Console.WriteLine(“DoSomething(params T[] items)”); } 现在我尝试调用这些方法: var items = new List { “foo”, “bar” }; DoSomething(items); DoSomething(“foo”, “bar”); 但在这两种情况下,都会调用params的重载。 我希望在List的情况下调用IEnumerable重载,因为它看起来更匹配(至少对我而言)。 这种行为是否正常? 谁能解释一下呢? 我在MSDN文档中找不到任何关于它的明确信息……这里涉及的重载决策规则是什么?

嵌套generics:为什么编译器在这种情况下不能推断出类型参数?

当我遇到一个我不理解的类型推断错误时,我正在玩一个爱好项目。 我把它简化为以下简单的例子。 我有以下类和函数: class Foo { } class Bar { } class Baz { } static T2 F(Func f) { return default(T2); } static T3 G(Func<T1, Func> f) { return default(T3); } 现在考虑以下示例: // 1. F with explicit type arguments – Fine F(x => new Bar()); // 2. F with implicit type arguments – Also […]