Tag: 类型推断

虽然intellisense列出了找不到定义吗?

我在Visual Studio 10中遇到了一个奇怪的错误(现在也是11)。 我有一个扩展方法 public static S Foo(this S s) where S : IEnumerable { return s; } 现在,如果我打电话 “”.Foo(); // => ‘string’ does not contain a definition for ‘Foo’ and no extension method ‘Foo’ accepting a first argument of type ‘string’ could be found (are you missing a using directive or an assembly reference?) […]

为什么var推断类型对象而不是XmlNodeList循环中的XmlNode?

如果像这样循环遍历XmlNodeList foreach (XmlNode foo in xmlNodeList) {string baa = foo.Attributes[“baa”].Value;} 一切都按预期工作 – foo显然是XmlNode类型,VS.NET IDE显示方法和字段。 另一方面 foreach (var foo in xmlNodeList) { string baa = foo.Attributes[“baa”].Value; } 没有编译因为这里foo是object类型。 类型推断类型的工作,但推断对象 。 显然,XmlNodeList的元素不是一个定义的类型,但是将它们分配给XmlNode而不是var会隐式地执行某些操作(强制转换或取消装箱)。 第一个问题:背后的机制是什么? 第二个(相关)问题:如何找到可以在这种循环中使用的类型? VS.NET IDE有帮助吗?

C#中的类型推断

我知道msdn应该是第一个去的地方,它将在我得到这里的独家新闻之后。 作为技术规范的一部分,msdn不会真正提供的是我现在要问的问题: 主题在日常开发过程中的用途如何? 它是否与clr中的匿名类型具有任何形状或forms的相关性? 如果没有它,它还能做什么呢? 哪些.netfunction依赖于主题,如果不作为框架的一部分就不可能存在? 为了记录问题的具体细节,如果使用lambdas和类型推断调用该方法,那么知道(在伪代码中)编译器如何实际确定所需类型将是非常有趣的。 我期待看到编译器逻辑流程如何找到该类型。

为什么编译器无法推断出对象数组类型?

我想知道为什么这是有效的: object[] array = {“bla bla bla..”, 23, true}; 但这些不是: var array = {“bla bla bla..”, 23, true }; var array2 = new [] {“bla bla bla..”, 23, true }; 在第二个例子中,为什么编译器不能根据数组初始值设定项中的值推断出数组类型? 这似乎很容易,特别是与generics类型推断相比。为了定义一个对象数组,为什么我必须明确指定数组类型? var array = new object[] { “bla bla bla..”, 23, true };

“x => {throw ..}”的Lambda推断为在重载方法中匹配Func ?

我不明白为什么C#最终在以下LINQPad代码中执行不正确的扩展方法: void Main() { // Actual: Sync Action “Expected: Sync Action”.Run(x => { x.Dump(); }); // Actual: Async Task “Expected: Async Task”.Run(async x => { await System.Threading.Tasks.Task.Run(() => x.Dump()); }); // Actual: Async Task!! “Expected: Sync Action”.Run(x => { throw new Exception(“Meh”); }); } static class Extensions { public static void Run(this T instance, Action […]

C#generics – 为什么lambda工作,简单的方法不工作?

我无法理解为什么C#编译器可以推断出类型 Array.ConvertAll(new int[1], i => Convert.ToDouble(i)); 但不是 Array.ConvertAll(new int[1], Convert.ToDouble); 当看起来前者比后者更复杂的演绎时。 有人可以解释为什么会这样吗?

C#generics方法解析失败,出现模糊的调用错误

假设我已经定义了两个不相关的类型和两个具有相同签名但不同类型filter的扩展方法: public class Foo {} public class Bar {} public static class FooExtensions { public static TFoo Frob(this TFoo foo) where TFoo : Foo { } public static TFoo Brob(this TFoo foo) where TFoo : Foo { } } public static class BarExtensions { public static TBar Frob(this TBar bar) where TBar : Bar { […]

C#类型后缀为十进制

我不知道我正在努力实现的正确措辞是什么,所以它可能已经在网上发布。 如果是,请善待。 好吧基本上我有这个方法。 public static T IsNull(IDataReader dr, String name, T nullValue) { return Helpers.IsNull(dr, dr.GetOrdinal(name), nullValue); } public static T IsNull(IDataReader dr, Int32 index, T nullValue) { if (dr.IsDBNull(index)) { return nullValue; } else { return (T)dr.GetValue(index); } } 被称为Helpers.IsNull(dr, “UnitWholeSale”, 0d) ,我得到的错误是“无法从double转换为十进制”。 现在我知道我可以使用decimal.Zero但有一些方法我可以简单地去0dec或类似的东西吗? 我只是讨厌那些冗长的快捷方式值(特别是在调用带有20个参数的构造函数时)。

C#类型推断有多好?

C#类型推断有多好? 我在某处读到它只适用于局部变量? 它是否适用于类级属性? 对于方法签名? 方法返回类型? 等等

为什么编译器无法在Regex.Matches的foreach中推断出正确的类型?

我试图从foreach循环中的Regex表达式迭代MatchCollection ,使用var关键字编译器推断chap是一个对象,它给出了一个Value属性未知的错误。 foreach (var chapter in ChapterExtractor.Matches(page.RawContent)) { chapter.Add(chapter.Value); // Does not compile! } 当var被Match替换时,它可以完美地工作。 foreach (Match chapter in ChapterExtractor.Matches(page.RawContent)) { chapter.Add(chapter.Value); // OK! } MSDN( http://msdn.microsoft.com/pt-br/library/system.text.regularexpressions.matchcollection ( v=vs.110 ) .aspx )中提供的示例也使用foreach循环中的Match类。 但是,编译器是否应该推断该chapter是Match类型而不是object ? 因此,似乎编译器隐式执行从object到Match 。 真的吗?