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

本文关键字:两个 int 变量 类型 程序 有可能 添加 关键字 自定义 是否 | 更新日期: 2023-09-27 18:03:16

我需要创建两个额外的关键字inputoutput,这样我就可以在我的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

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

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

你可以这样写:

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);
    }
}

那么swap方法如下:

    static void swap<T>(Input<T> input, Output<T> output)
    {
        output.value = input.value;
    }

和用法:

            Input<int> myInput = 1;
            Input<int> myInput2 = 1;
            Output<int> myOutput = 0;
            swap(myInput, myOutput); //Compiles
            swap(myInput, myInput2); //Error
            swap(myOutput, myInput); //Error

我不知道你为什么需要这个,但是这个技巧只是出现在我的脑海里…可以使用基本类型作为包装器

            double a = 0.0;
            int b = 1;
            float c = 3;
            //this will compile 
            a = b;
            //these will give compile error
            b = c;
            c = a;