草庐IT

c# - 简化泛型类型推断

我正在编写一个通用代码,用于处理从多个来源加载数据的情况。我有一个具有以下签名的方法:publicstaticTResultLoadFromAnySource(thisTSectionsection,stringserviceBaseUri,stringnodeName)whereTSection:ConfigurationSectionwhereTResult:IDatabaseConfigurable,new()whereTContract:new()但这有点矫枉过正:当我通过TResult时,我已经知道什么了TContract和TSection确实是。在我的示例中:publici

c# - 对于 C# 无法使用类型约束推断泛型类型参数,是否有解决方法?

EricLippert在他的博文中解释了http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx为什么类型推断不考虑约束,这是有道理的,因为不能通过简单地更改类型约束来重载方法。但是,我想找到一种使用两种泛型类型实例化对象的方法,一种可以推断,另一种可以在考虑约束的情况下推断,而无需指定任何类型。给定类型:publicinterfaceI{OtherCreateOther();}publicclassC:I{publicOtherCreate

c# - 上界/下界推理和修复

在C#4.0规范7.5.2.9中:Alower-boundinferencefromatypeUtoatypeVismadeasfollows:如果V是未固定的Xi之一,则将U添加到Xi的下限集合中。[...]这个部分我已经看了很多遍了。缺少部分引用,这个定义读起来就像一个循环引用。所以,我希望在附近找到语法制作或章节引用来澄清……我没有。本节还与Fixing相关,后者也存在类似的定义问题。什么是上限推断与下限推断? 最佳答案 我会尽力描述得更清楚。最坏的情况,我以不同的方式描述它。上限/下限推断是针对用于特定泛型方法调用的类型参数

c# - 具有多重实现的协变接口(interface)的泛型类型推断,如何解决它?

考虑这个什么都不做的愚蠢程序:interfaceI{}classA1:I{}classA2:A1,I{}classB1{}classB2:B1,I{}classC1:I{}classC2:C1,I{}staticclassProgram{staticvoidf(Iobj){}staticvoidMain(){f(newA2());f(newA2());f(newB2());f(newB2());f(newC2());f(newC2());}}这表明A2和C2同时实现I和I,那B2同时实现I和I.但是,将其修改为staticvoidMain(){f(newA2());f(newB2())

c# - 用于类型推断的通用身份函数

我想知道这是否可能,因为我5分钟的实验证明没有结果。我希望它会像这样简单:TIdentity(Tt){returnt;}但这无法编译采用Func参数的泛型方法。例如订单。即使指定类型参数(这正是我想要避免的!),它也无法编译。接下来我尝试了一些我认为可行的方法:FuncMakeIdentity(){return(Tt)=>(R)(object)t;}也不行:((这在应用类型参数时编译,再次,不是我想要的)有没有人有幸做出这样的事情?更新:请不要说:x=>x,我知道,这很明显!我要的是一个函数,而不是一个表达式:)更新2:当我提到身份时,我的意思是在功能意义上,函数只是返回您传递给它的同

c# - 无法从高阶函数的用法中推断出类型参数

我有以下高阶函数:publicstaticFuncNot(FuncotherFunc){returnarg=>!otherFunc(arg);}并尝试这样调用它:varisValidStr=LinqUtils.Not(string.IsNullOrWhiteSpace);编译器给我“无法从用法中推断出类型参数”错误。但以下工作:varisValidStr=LinqUtils.Not((strings)=>string.IsNullOrWhiteSpace(s));我想知道有什么区别?string.IsNullOrWhiteSpace已经是具有完全相同签名的非重载函数。如评论中所述,以下

c# - 比 var 更好的推断变量的词

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。这可能会被关闭,但我还是会尝试。前几天我向一位VB6程序员展示了我的一些C#代码,他注意到了var关键字并且说“哦,一个变体类型,当你这样做时,它并不是真正的强类型。”我不得不继续典型的“var!=VARIANT”演讲来向他解释这不是它只是编译器推断的变体。我在考虑他们(C#团队)可以使用的其他词,这样这种事情就不会发生。我个人喜欢infer,比如:in

C# 为什么这种类型的推断方法调用不明确?

这个问题在这里已经有了答案:GenerictypeparameterandNullablemethodoverload(1个回答)关闭7年前。下面这对函数尝试复制C#6.0中可用的null条件运算符:publicstaticTResultBind(thisTobj,Funcfunc)whereT:class{returnobj==null?default(TResult):func(obj);}publicstaticTResultBind(thisNullableobj,Funcfunc)whereT:struct{returnobj.HasValue?func(obj.Value)

c# - 编译器在传递方法时无法确定泛型类型

我在使用C#和泛型类型推断时遇到了问题。我想编写一个方法来传递具有任何类型的方法,但编译器无法推断我传入的方法的类型。编译器总是提示消息Expectedamethodwith'???TestFunc(???,???)'signature这是一个测试用例。usingSystem;publicclassExample{privateinterfaceITest{intTestFunc(stringstr,inti);}privateclassTest:ITest{publicintTestFunc(stringstr,inti){return0;}}publicstaticvoidMain

c# - 为什么 C# 编译器不自动推断此代码中的类型?

为什么C#编译器不推断FooExt.Multiply()的事实满足Functions.Apply()的签名?我必须指定一个类型为Func的单独委托(delegate)变量让代码工作......但似乎类型推断应该处理这个问题。我错了吗?如果是这样,为什么?编辑:收到的编译错误是:ThetypeargumentsformethodFirstClassFunctions.Functions.Apply(T1,System.Func,T2)'cannotbeinferredfromtheusage.Tryspecifyingthetypeargumentsexplicitlynamespace