为什么CredentialCache类需要完全限定名称?

时间:2014-01-25 05:37:33

标签: c#

只是想知道为什么CredentialCache类需要一个完整的限定名称?

例如

using System.Net;

namespace test
{
class tc
{

public void tm()
{
credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; //error
credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; //no error
}

}
}

3 个答案:

答案 0 :(得分:3)

没有。但是您在;之后省略了using System.Net

更新

好的,因此错误消息会假设您的班级中有一个名为CredentialCache的成员。由于C#规范声明名称是从内部到外部解析的,因此它在获取System.Net.CredentialCache之前选择此成员(有关精确说明,请参阅 ECMA 334 4th Ed。C#语言规范 - C#,10.8命名空间和类型名称(从我的头脑中))。

您可以使用以下类重现此行为:

using System.Net;

namespace NameResolution{
public class TestUnqualifiedNameResolution {
    public DoSomething(){
        Dictionary<string, Microsoft.Xrm.Sdk.Client.Authenti‌‌​​cationCredentials> CredentialCache = new Dictionary<string, Microsoft.Xrm.Sdk.Client.Authenti‌‌​​cationCredentials>();
        //Fully qualified name is resolved to the type you are looking for, because the Dictionary does not match the name
        var credentialCache0 = System.Net.CredentialCache.DefaultCredentials;
        //Unqualified name is resolved to the nearest matching (here the Dictionary)
        var credentialCache1 = CredentialCache.DefaultNetworkCredentials;
    }
}
}

通过重命名错误解析的成员,CredentialCache将按预期解析为System.Net.CredentialCache。

只是为了好玩

以下代码也有效(但你永远不应该写这样的东西):

using System;
using System.Net;

namespace ConsoleApplication {
    class Program {
        static void Main()
        {
                        // That's a System.Int32!
            int a = System.Net.CredentialCache;
            Console.WriteLine("{0} == System.Int32", a.GetType().FullName);
            Console.ReadKey();
        }
        public static class System
        { 
            public static Net Net { get { return new Net(); } }
        }
        public class Net
        {
            public int CredentialCache { get { return 0; } }
        }
    }
}

答案 1 :(得分:2)

除非您在范围内有另一个CredentialCache类,并且编译器不知道如何正确解析该符号,否则不会导致错误。

您应该能够从实际的错误文本中确定。

答案 2 :(得分:2)

CredentialCache本身不需要完整的限定名称。问题必定在其他地方。您可能已在测试命名空间中定义了另一个CredentialCache类。 为了提供更多帮助,我需要知道您获得的错误以及credentials.Windows.ClientCredential中的凭证变量是什么。您在哪里定义它以及它的类型是什么?