Tag: 重载

generics和从差异类调用重载方法 – 优先级问题

首先,抱歉标题,但我想不出更好的事情…… 我的问题可以通过简单的代码示例呈现: public static class Test { public static int GetInt(T source) { return Convert.ToInt32(source); } } public static class Convert { public static int ToInt32(byte source) { return 30; } public static int ToInt32(object source) { return 10; } } 为什么Console.WriteLine(Test.GetInt(20)); 打印10 ,而不是30 ? 我一直认为.NET中的generics在运行时由JIT解决。 为什么然后抖动不够智能,发现有ToInt32(byte)方法,这适合我们的byte参数类型? 此行为使得Convert静态类方法在简单类型的装箱/拆箱操作中调用结果。

函数重载与可选参数

所以我只是在思考函数重载…… 重载方法共享相同的名称,但具有唯一的签名。 参数的数量,参数的类型或两者必须不同。 仅根据不同的返回类型不能重载函数。 所以在下面的例子中,为什么重载setName而不是使用中间名和姓氏值的可选参数? class funOverload { public string name; //overloaded functions public void setName(string last) { name = last; } public void setName(string first, string last) { name = first + “” + last; } public void setName(string first, string middle, string last) { name = first + “” + middle + “” […]

“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#方法重载问题

我正在研究一个项目,我有一个通用的抽象类型,它接受一个类型参数,它本身是从抽象类型派生的。 如果你想知道为什么我会这样做,请看这个问题 。 我遇到了一个有趣的问题,即在抽象类中定义的派生类中重载方法。 这是一个代码示例: public abstract class AbstractConverter where U : AbstractConvertible where T : AbstractConverter { public abstract T Convert(U convertible); } public class DerivedConvertibleConverter : AbstractConverter { public DerivedConvertibleConverter(DerivedConvertible convertible) { Convert(convertible); } public override DerivedConvertibleConverter Convert(DerivedConvertible convertible) { //This will not be called System.Console.WriteLine(“Called the most derived method”); return this; } […]

是否可以为表单重载ShowDialog方法并返回不同的结果?

编辑:这个方法实际上工作得很好,我问它后来找到了解决方案。 我在重载的ShowDialog()方法中添加了正确的调用(它不是过载,甚至是重写,但它的工作原理相同。我的新问题是底部的问题。 我有一个表单,您可以在其中单击三个按钮之一。 我已经为返回的结果定义了一个枚举。 我想打电话: MyFormResults res = MyForm.ShowDialog(); 我可以使用以下代码添加一个新的ShowDialog方法: public new MyFormResults ShowDialog() { //Show modal dialog base.ShowDialog(); //This works and somehow I missed this return myResult; //Form level variable (read on) } 单击按钮时,我为结果设置了一个表单级变量: MyFormResults myResult; private void btn1_click(object sender, EventArgs e) { myResult = MyFormsResults.Result1; this.DialogResult = DialogResult.OK; //Do I need this for […]

方法重载解析如何工作(LINQ Where扩展方法)?

如果我有一个类型为IQueryable的变量,我有四个扩展方法,用于命名空间Systm.Linq Where : public static IQueryable Where(this IQueryable source, Expression<Func> predicate); public static IQueryable Where(this IQueryable source, Expression<Func> predicate); public static IEnumerable Where(this IEnumerable source, Func predicate); public static IEnumerable Where(this IEnumerable source, Func predicate); (最后两个因为IQueryableinheritance自IEnumerable 。) 如果我使用ObjectQuery类型的变量(在命名空间System.Data.Objects ),我有五个可用的重载,即上面的四个(因为ObjectQuery实现了IQueryable和IEnumerable等等接口)以及此类的实例方法: public ObjectQuery Where(string predicate, params ObjectParameter[] parameters); 如果我在使用IQueryable或ObjectQuery执行相同的编程错误, IQueryable出现非常不同的编译器错误。 这是一个示例程序(VS2010 SP1中的标准C#控制台应用程序模板+ System.Data.Entity.dll程序集添加到项目引用中,编译器错误在以下四个示例的注释中): using System.Data.Objects; using System.Linq; […]

为什么重载方法的优先级低于实例方法

我有基础A public class A { public virtual void Method(A parameter) { Console.WriteLine(MethodBase.GetCurrentMethod()); } public virtual void Method(B parameter) { Console.WriteLine(MethodBase.GetCurrentMethod()); } } 固有的B public class B : A { public virtual void Method(object parameter) { Console.WriteLine(MethodBase.GetCurrentMethod()); } public override void Method(A parameter) { Console.WriteLine(MethodBase.GetCurrentMethod()); } public override void Method(B parameter) { Console.WriteLine(MethodBase.GetCurrentMethod()); } } 静态类S带扩展方法 […]

params超载明显模糊 – 仍然编译和工作?

我们在代码中找到了这些: public static class ObjectContextExtensions { public static T Find(this ObjectSet set, int id, params Expression<Func>[] includes) where T : class { … } public static T Find(this ObjectSet set, int id, params string[] includes) where T : class { … } } 如您所见,除了params之外,它们具有相同的特征。 它们被用于多种方式,其中之一: DBContext.Users.Find(userid.Value); //userid being an int? (Nullable) 对我来说奇怪的是,它解决了第一次超载。 Q1:为什么这不会产生编译错误? Q2:为什么C#编译器解析了上面第一个方法的调用? 编辑 […]

为什么重载true和false而不是定义bool运算符?

我一直在阅读有关在C#中重载true和false的内容,我想我理解这与定义bool运算符之间的基本区别。 我看到的例子是这样的: public static bool operator true(Foo foo) { return (foo.PropA > 0); } public static bool operator false(Foo foo) { return (foo.PropA <= 0); } 对我来说,这跟说: public static implicit operator bool(Foo foo) { return (foo.PropA > 0); } 据我所知,区别在于,通过分别定义true和false,您可以拥有一个既是真也可以是假的对象,或者既不是真也不是假: public static bool operator true(Foo foo) { return true; } public static bool operator false(Foo […]

generics方法重载的问题

我有以下方法: void s(int a, tb) { … .. . } void s(int a, int b) { … .. . } void s(int a, long b) { … .. . } 当我想用它作为s(10,10)我在工具提示中看到了这些覆盖。 s(int a,int b); 和 s(int a,long b); 。 但是,我想我必须看到s(int a,long b); 。 怎么了 ? 我有visual studio 2008 sp1 。 谢谢 更新:我在Visual Studio 2010中测试过它。结果是一样的。 更新:它似乎是关于c#而不是visual […]