我想知道TypeScript的never type是否有C#等效项

例如,我在TS中编写此代码,将出现构建时间错误。

enum ActionTypes {
    Add,
    Remove
}

type IAdd = {type: ActionTypes.Add};
type IRemove = {type: ActionTypes.Remove};

type IAction = IAdd | IRemove;

const ensureNever = (action: never) => action;

function test(action: IAction) {
    switch (action.type) {
        case ActionTypes.Add:
            break;
        default:
            ensureNever(action);
            break;
    }
}

错误是:Argument of type 'IRemove' is not assignable to parameter of type 'never'.
当有人更改一个文件中的逻辑并且我想确保这种新情况在任何地方都可以处理时,这非常有用。

有什么办法可以在C#中做到这一点? (我在Google周围搜索,但没有找到任何东西)

这是我到目前为止所拥有的...

using System;
class Program
{
    private enum ActionTypes
    {
        Add,
        Remove
    }

    interface IAction {
        ActionTypes Type { get; }
    }

    class AddAction : IAction
    {
        public ActionTypes Type
        {
            get {
                return ActionTypes.Add;
            }
        }
    }

    class RemoveAction : IAction
    {
        public ActionTypes Type
        {
            get
            {
                return ActionTypes.Remove;
            }
        }
    }

    static void Test(IAction action)
    {
        switch (action.Type)
        {
            case ActionTypes.Add:
                Console.WriteLine("ActionTypes.Add");
                break;
            default:
                // what should I put here to be sure its never reached?
                Console.WriteLine("default");
                break;
        }
    }

    static void Main(string[] args)
    {
        var action = new RemoveAction();
        Program.Test(action);
    }
}

我想确保在构建时而不是运行时出现错误。

最佳答案

不幸的是,我认为C#编译器不够聪明。即使您在action.Type的switch语句中的默认情况下引发新的异常,对于丢失的ActionTypes.Remove情况,也不会出现编译时错误。

我发现this MSDN blog post谈到never类型,“它不太可能会成为主流CLR语言的功能”。

关于c# - TypeScript永不键入C#?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57778549/

10-12 06:44