是否可以在c#程序中添加额外的自定义关键字,以便使两个int变量成为不同的类型?

a.t*_*aby 0 c#

我需要创建两个额外的关键字input,output所以我可以在我的c#代码中减少这些:

input int a;
input int b;
output int c;
swap (input int lhs, output int rhs) { ... }
swap(a,c) // should be compiled;
swap(c,a) // should return compile error
swap(a,b) // should return compile error
Run Code Online (Sandbox Code Playgroud)

我还需要编译器接受a = b但拒绝b = cc = a.可能吗?那么如果不可能解决方案是什么?我已经使用Output<T>Input<T>作为所有类型的通用包装器,但每当我想访问这些通用包装器中的值时,我讨厌使用值getter和setter!

Mat*_*ili 6

你可以使用这样的东西:

public sealed class Input<T>
{
    public T value { get; set; }

    public Input(T v)
    {
        value = v;
    }

    public static implicit operator T(Input<T> d)
    {
        return d.value;
    }

    public static implicit operator Input<T>(T d)
    {
        return new Input<T>(d);
    }
}

public sealed class Output<T>
{
    public T value { get; set; }

    public Output(T v)
    {
        value = v;
    }

    public static implicit operator T(Output<T> d)
    {
        return d.value;
    }

    public static implicit operator Output<T>(T d)
    {
        return new Output<T>(d);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后swap方法如下:

    static void swap<T>(Input<T> input, Output<T> output)
    {
        output.value = input.value;
    }
Run Code Online (Sandbox Code Playgroud)

用法:

            Input<int> myInput = 1;
            Input<int> myInput2 = 1;
            Output<int> myOutput = 0;

            swap(myInput, myOutput); //Compiles
            swap(myInput, myInput2); //Error
            swap(myOutput, myInput); //Error
Run Code Online (Sandbox Code Playgroud)