相关疑难解决方法(0)

方法重载决策系统如何决定在传递空值时调用哪个方法?

所以例如你有一个类似的类型:

public class EffectOptions
{
    public EffectOptions ( params object [ ] options ) {}

    public EffectOptions ( IEnumerable<object> options ) {}

    public EffectOptions ( string name ) {}

    public EffectOptions ( object owner ) {}

    public EffectOptions ( int count ) {}

    public EffectOptions ( Point point ) {}

}
Run Code Online (Sandbox Code Playgroud)

这里我只使用构造函数给出示例,但如果它们是类型本身的非构造方法,结果将是相同的,对吧?

所以当你这样做时:

EffectOptions options = new EffectOptions (null);
Run Code Online (Sandbox Code Playgroud)

会调用哪个构造函数,为什么?

我可以自己测试一下,但我想了解重载分辨率系统是如何工作的(不确定它是否被称为).

.net c# overload-resolution

35
推荐指数
2
解决办法
4338
查看次数

选择哪种C#方法重载?

为什么两个重载都匹配时调用泛型方法?

public static void method1(object obj)
{
    Console.WriteLine("Object");
}

public static void method1<T>(T t)
{
    Console.WriteLine("Type T");
}

public static void Main(String args[])
{
    method1("xyz"); //Will print "Type T";
}
Run Code Online (Sandbox Code Playgroud)

这里不应该有任何冲突,对吧?

.net c# generics

23
推荐指数
2
解决办法
3386
查看次数

为什么从int到uint的隐式转换有效?

使用Casting null并不能作为灵感编译,并且来自Eric Lippert的评论:

这表明了一个有趣的案例."uint x =(int)0;" 即使int不能隐式转换为uint也会成功.

我们知道这不起作用,因为object无法分配到string:

string x = (object)null;
Run Code Online (Sandbox Code Playgroud)

但这确实如此,但直觉上它不应该:

uint x = (int)0;
Run Code Online (Sandbox Code Playgroud)

为什么编译器允许这种情况下,int不隐式转换为uint

.net c# compiler-construction type-conversion implicit-conversion

13
推荐指数
2
解决办法
5911
查看次数

为什么这不是一个模棱两可的电话?

出于好奇,为什么Log(null)在这种情况下不是一个模棱两可的电话?

class Program
{
    static void Main(string[] args)
    {
        Log(null); // Output is "String"
    }

    static void Log(object value)
    {
        Console.WriteLine("Object");
    }

    static void Log(string value)
    {
        Console.WriteLine("String");
    }
}
Run Code Online (Sandbox Code Playgroud)

由于这两个Log(object)Log(string)接受null作为参数我期待编译器给我一个模棱两可的调用错误,而是它选择调用Log(string).为什么不Log(object)呢?

c#

6
推荐指数
0
解决办法
83
查看次数