C#中如何解决类名冲突问题

Har*_*hen 0 c# namespaces

我使用不使用命名空间的第三方 dll,它包含一个名为Speaker.

// Decompiled with JetBrains decompiler
// Type: Speaker
// Assembly: StreamSDK, Version=1.0.6782.19546, Culture=neutral,PublicKeyToken=null
// MVID: 82353EB3-505A-4A47-8EEB-ED74ED4FC9B9
// Assembly location: /Users/haha/test/Assets/_ThirdParty/SteamSDK/Core/XMLSerializer/StreamSDK.dll

public enum Speaker
{
  remote,
  local,
  none,
}
Run Code Online (Sandbox Code Playgroud)

我的本地项目在指定的命名空间下也有这个类名Photon.Voice.Unity;。导入 dll 后,发生错误,因为编译器将本地Speaker视为第三方的Speaker.

我已经在本地项目中使用了命名空间:

using Photon.Voice.Unity;
Run Code Online (Sandbox Code Playgroud)

错误发生在以下代码中:

private void OnSpeakerCreated(Speaker speaker)
{
    speaker.gameObject.transform.SetParent(this.RemoteVoicesPanel, false);
}
Run Code Online (Sandbox Code Playgroud)

错误:

error CS1061: 'Speaker' does not contain a definition for 'gameObject' and no accessible extension method 'gameObject' accepting a first argument of type 'Speaker' could be found (are you missing a using directive or an assembly reference?)
Run Code Online (Sandbox Code Playgroud)

添加完整的命名空间后,代码就通过了。

private void OnSpeakerCreated(Photon.Voice.Unity.Speaker speaker)
{
    speaker.gameObject.transform.SetParent(this.RemoteVoicesPanel, false);
}
Run Code Online (Sandbox Code Playgroud)

但我不想这样做,我只想禁止Speaker在指定的 cs 文件中使用第三方或任何其他不需要更改当前代码的方式。

Swe*_*per 5

如果你Photon.Voice.Unity.Speaker每次都懒得写,你可以创建一个别名来使用using别名指令

using PhotonSpeaker = Photon.Voice.Unity.Speaker;
Run Code Online (Sandbox Code Playgroud)

现在你可以写:

private void OnSpeakerCreated(PhotonSpeaker speaker)
{
    speaker.gameObject.transform.SetParent(this.RemoteVoicesPanel, false);
}
Run Code Online (Sandbox Code Playgroud)