提问者:小点点

未调用枚举得扩展方法


我读过很多书,有很多类似问题的答案,但即使遵循这些答案,我也无法让这个问题奏效。扩展方法是静态的,公共的,有this,在同一个命名空间中,所以不需要导入。。。我错过了什么?我的C#不太好。

namespace LDB
{

    public enum Neg { isNegated, notNegated };

    static class NegStringifier {
        public static string ToString(this Neg n) {
            string res = n switch {
                Neg.isNegated => "flowers",
                Neg.notNegated => "kittens",
                //_ => null
            };
            return res;
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine(Neg.isNegated.ToString());
            System.Console.WriteLine(Neg.notNegated.ToString());
            ...

输出:

isNegated
notNegated

先道歉,我知道这将是一些微不足道的事情,但我看不出什么。


共2个答案

匿名用户

编译器只有在找不到任何适用于方法调用的“常规”实例方法时才会查找扩展方法。在本例中,Object类提供了一个ToString()方法,因此这里有一个适当的方法,编译器使用的就是这个方法。

如果将扩展方法和调用代码中的ToString更改为其他名称(例如ExtensionToString),您将看到正在使用它。

匿名用户

将ToString函数替换为:

    public static string ToString(this Neg n)
    {
        string res = "";
        switch (n)
        {
            case Neg.isNegated:
                res = "flowers";
                break;
            case Neg.notNegated:
                res = "kittens";
                break;
        }

        return res;
    }