有没有办法在 C# 中为单个静态(公共)方法添加别名?

问题描述 投票:0回答:2

除了允许导入命名空间内的所有类型之外,C#中的using指令还允许通过别名(例如using A = Something.A;)导入

单一类型
或通过以下方式从类型导入所有静态方法
using static
。 在 C# 规范中,我没有发现任何提及导入 单一静态方法

问题:是否有其他方法可以实现相同的目标(即通过放置在源文件开头的one-line指令/语句从外部类型导入单个静态方法)?如果没有,是否有任何记录在案的原因,或者是否有任何证据表明未来计划允许这样做?

作为一个示例,并且作为想要为特定静态方法添加别名而不是使用类中的所有静态方法(包括重载)的可能动机,请考虑以下代码片段:

using static System.Console; // includes System.Console.WriteLine
using static System.Diagnostics.Debug; // includes System.Diagnostics.Debug.Assert (as desired) and System.Diagnostics.Debug.WriteLine (not desired)

class Program {
   static void Main() {
      Assert(3 + 5 == 8);
      // the following doesn't know which WriteLine to use
      WriteLine("My test passed!"); // error CS0121: The call is ambiguous
   }
}

这是我想要的语法(这是非法的):

using static System.Console;
using static Assert = System.Diagnostics.Debug.Assert;

class Program {
   static void Main() {
      Assert(3 + 5 == 8);
      WriteLine("My test passed!");
   }
}

在类中定义一个方法来调用我想要别名的方法,这是可行的,但不允许我将其与其他 using 指令一起放在文件的顶部:

class Program {
   static void Assert(bool c) { System.Diagnostics.Debug.Assert(c); }
}

以下是一些将某些内容放在文件顶部的失败尝试:

using Assert = System.Diagnostics.Debug.Assert; // error CS0426 (i.e. Assert is not a type)
using static Assert = System.Diagnostics.Debug.Assert; // error CS8085: error CS8085: A 'using static' directive cannot be used to declare an alias
var Assert = System.Diagnostics.Debug.Assert; // error CS0815
System.Action<bool> Assert = System.Diagnostics.Debug.Assert; // error CS1618
System.Action<bool> Assert = (c) => System.Diagnostics.Debug.Assert(c); // error when using Assert: error CS1618
void Assert(bool c) { System.Diagnostics.Debug.Assert(c); } // error when using Assert: error CS8801
c# static-methods using-directives
2个回答
2
投票

没有这种类型的编译时别名,但通过代码自己“别名”它是一件简单的事情。

class Program
{
    static void WriteLine(string message) => Console.WriteLine(message);

    static void Main()
    {
        Assert(3 + 5 == 8);
        WriteLine("My test passed!"); 
    }
}

1
投票

由于方法重载,这种别名并不简单,例如 这里有

Console.WriteLine
重载列表。.

如何消除别名方法与其重载的歧义?

© www.soinside.com 2019 - 2024. All rights reserved.