Tag: 类型推理

为什么类型推断和隐式运算符在以下情况下不起作用?

我将试着用一个例子来解释我的问题: class V { public readonly Func Get; public readonly bool IsConstant; V(Func get, bool isConstant) { Get = get; IsConstant = isConstant; } public static implicit operator V(T value) { return new V(() => value, true); } public static implicit operator V(Func getter) { return new V(getter, false); } } void DoSomething(V v) { […]

编写扩展方法来调用控件的更好方法是什么?

我有这个通用函数来调用WinForm控件: public static void Invoke(this Control c, Action action) { if (c.InvokeRequired) c.TopLevelControl.Invoke(action); else action(); } 我正在考虑通过采用更严厉的限制来防止无意义的事情,使其变得更好,可能是这样的: button1.Invoke(() => list.Add(1)); 还可以进行冗余打字,例如: button1.Invoke(() => button1.Hide()); 因为我们已经指定this是button1 。 所以我做到了: public static void Invoke(this T c, Action action) where T : Control { if (c.InvokeRequired) c.TopLevelControl.Invoke(action); else action(c); } 现在我要打电话, button1.Invoke((c) => c.Hide()); 要么 button1.Invoke((c) => button1.Hide()); 现在我觉得即便如此,还有一些不仅仅是需要打字。 […]

通用类型推断无法使用动态?

我最近一直在使用Massive,一个返回IEnumerable 集合的Micro-ORM。 当我尝试使用LINQ查询其中一个集合时,我发现了一个意外的问题。 虽然编译器似乎没有任何问题可以解决这个问题,但是即使传递给它的一个参数被声明为动态,string.Format也会返回一个字符串… dynamic dynamicString = “d”; // just using a string here for simplicity, same problem occurs with any other type string explicitString = string.Format(“string is {0}”, dynamicString); // works without issues …在以下情况中似乎无法推断出这一事实: IEnumerable strings = new[] { “a”, “b”, “c” }; IEnumerable dynamics = strings; IEnumerable output = dynamics.Select(d => string.Format(“string is […]

仅当S和T不同时,才从λ表达式的输出推断出Func 的T?

当S和T不同时,这有效: public static void Fun(Func func) { } Fun((string s) => true); //compiles, T is inferred from return type. 但, public static void Fun(Func func) { } Fun(t => true); //can’t infer type. 在第一个例子中,由于T是从lambda表达式的返回类型推断的,所以第二个例子中的T也不能被推断出来吗? 我想它是这样做的,但是为什么第一个T未知,当Func第二个T已知时,毕竟T == T对吗? 或者在Func的情况下是否有推断类型的订单?

使用嵌套的lambda表达式集合来创建对象图

我有兴趣利用lambda表达式来创建属性选择器树。 使用场景是我们有一些代码对对象图进行一些递归reflection,并且为了限制递归的范围,我们当前正在使用Attributes来标记应该遍历哪些属性。 ie获取对象的所有修饰属性,如果该属性是具有修饰属性的引用类型,则对每个属性重复。 使用属性的限制是您只能将它们放在您控制源的类型上。 lambda表达式树允许在任意类型的公共成员上定义范围。 使用速记方式定义这些表达式会很方便,这反映了对象图的结构。 最终,我喜欢这样的事情: Selector selector = new [] { (t => Property1), (t => Property2) { p => NestedProperty1, p => NestedProperty2 } }; 现在,我能做的最好的事情就是为每个节点声明一个实例,如下所示: var selector = new Selector() { new SelectorNode(t => Property1), new SelectorNode(t => Property2) { new SelectorNode(p => NestedProperty1), new SelectorNode(p => NestedProperty2) }, }; 这段代码没有任何问题,但你必须明确地为每个节点写出类型参数,因为编译器无法推断出类型参数。 […]

隐式强制转换对委托类型推断的意外影响

我有一个简单的Money类型,带有decimal的隐式decimal : struct Money { decimal innerValue; public static implicit operator Money(decimal value) { return new Money { innerValue = value }; } public static explicit operator decimal(Money value) { return value.innerValue; } public static Money Parse(string s) { return decimal.Parse(s); } } 我定义了一个Sum()重载来操作这些值: static class MoneyExtensions { public static Money Sum(this IEnumerable source, Func […]

在C ++ / CLI中是否有与C#“var”关键字相同的名称?

在C#中,我喜欢var关键字,例如: var myList = new List(); 在C ++ / CLI中是否有任何等价物,或者每次都必须重复类型名称,如下所示: List^ myList = gcnew List(); 到目前为止,无法在文档或Google中找到明确的声明。 我正在使用Visual Studio 2008。

为什么C#编译器不能从函数签名推断generics类委托?

我正在使用一个函数,它将两个函数作为参数,并返回一个新的组合函数: public static Action Compose(Action first, Action second) { return new Action(arg => { first(arg); second(); }); } 我注意到编译器抱怨如果我没有指定T ,当发送静态或成员函数时(而不是实际的Action对象): static void Main(string[] args) { // compiler error here var composed = Compose(Test, () => Console.WriteLine(” world”)); composed(“hello”); Console.ReadLine(); } public static void Test(string arg) { Console.Write(arg); } 错误消息: 无法从用法中推断出方法’ConsoleTest.Program.Compose(System.Action,System.Action)’的参数。 尝试显式指定类型参数。 我的问题 :为什么不能在这里推断出类型论证? Test的签名在编译时是已知的,不是吗? 是否真的有一些function可以代替Test […]

为什么List 在协变接口MyInterface 上无效

跟进前一个问题的问题 ,这被认为是一个共同变异问题。 更进一步,如果我按如下方式修改IFactory : class Program { static void Main(string[] args) { IFactory factory = new Factory(); } } class Factory : IFactory { } class Product : IProduct { } interface IFactory where T : IProduct { List MakeStuff(); } interface IProduct { } 我明白了: 方差无效:类型参数T必须在Sandbox.IFactory.MakeStuff()上不变地有效。 T是协变的。 为什么这不是无效的? 该如何/应该如何解决?

如何在LINQ中实现具有良好调用语法的NotOfType ?

我正在尝试为NotOfType提供一个实现,它具有可读的调用语法。 NotOfType应该是NotOfType OfType的补充,因此将产生不属于T类型的所有元素 我的目标是实现一个像OfType一样调用的方法,就像在这个片段的最后一行一样: public abstract class Animal {} public class Monkey : Animal {} public class Giraffe : Animal {} public class Lion : Animal {} var monkey = new Monkey(); var giraffe = new Giraffe(); var lion = new Lion(); IEnumerable animals = new Animal[] { monkey, giraffe, lion }; IEnumerable fewerAnimals = […]