只是想知道为什么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
}
}
}
答案 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.AuthenticationCredentials> CredentialCache = new Dictionary<string, Microsoft.Xrm.Sdk.Client.AuthenticationCredentials>();
//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中的凭证变量是什么。您在哪里定义它以及它的类型是什么?