C# 3.0 关于var类型的问题

C# 3.0 关于var类型的问题,c#-3.0,C# 3.0,我不熟悉C#3.0变量类型。这里我有一个关于这种类型的问题。以库中的以下简单代码为例: public class MyClass { public var Fn(var inValue) { if ( inValue < 0 ) { return 1.0; } else { return inValue; } } }

我不熟悉C#3.0变量类型。这里我有一个关于这种类型的问题。以库中的以下简单代码为例:

 public class MyClass {
    public var Fn(var inValue)
    {
        if ( inValue < 0 )
        {
           return 1.0;
        }
        else 
        { 
           return inValue;
        }
    }
 }
公共类MyClass{
公共var Fn(var无效)
{
如果(无效<0)
{
返回1.0;
}
其他的
{ 
返回无效;
}
}
}
我认为该参数是匿名类型。如果我传入一个float值,那么Fn应该返回一个float类型。如果传入双值类型,Fn是否返回双值类型?整数值类型作为输入值怎么样


实际上,我想将var-type与这个函数/方法结合使用,以动态地获得不同输入类型的不同返回类型。我不确定这种用法是否正确?

您不能将var用作方法的返回类型

对于返回值或参数类型(或字段),不能使用
var
。只能对局部变量使用它

埃里克·利珀特有一个朋友。我不确定是否有类似的返回值和参数类型。参数类型当然没有多大意义——编译器可以从哪里推断类型?您尝试调用哪些参数的方法?(事实上,这与F差不多,但C更为保守。)

不要忘记,
var
是严格的静态类型-这只是让编译器为您推断静态类型的一种方法。它仍然只是一个单一类型,就像您在代码中键入了名称一样。(当然,除了匿名类型之外,你不能这样做,这也是该功能的动机之一。)

编辑:有关
var
的更多详细信息,您可以免费下载C#Depth的第8章-这包括
var
部分。显然,我希望你会想买这本书,但没有压力:)

编辑:为了实现您的实际目标,您几乎可以使用通用方法实现所有这些:

public class MyClass
{
    public T Fn<T>(T inValue) where T : struct
    {
        Comparer<T> comparer = Comparer<T>.Default;
        T zero = default(T);
        if (comparer.Compare(inValue, zero) < 0)
        {
            // This is the tricky bit.
            return 1.0;
        }
        else 
        { 
            return inValue;
        }
    }
}

等等

哈,今晚我赢了你两次。这不会经常发生。不过我会等待你的上级编辑:)对不起,约翰,我会给“上级编辑”打分,但你的幽默度也要加1:)我的代码可能是错的。我读了一些关于在局部范围内使用var的文章,但没有在库中作为公共方法的var类型。不确定,因为我没有VS来验证它。太糟糕了,我猜。不像Ruby或Python。没关系。谢谢@大卫:那些是动态语言。如果你不喜欢静态输入,你在C#中就不会有什么乐趣。虽然C#4引入了动态类型,但我只在真正需要的地方使用它。C#是围绕静态类型构建的。
public class MyClass
{
    private static readonly Dictionary<Type, object> OneValues
        = new Dictionary<Type, object>
    {
        { typeof(int), 1 },
        { typeof(long), 1L },
        { typeof(double), 1.0d },
        { typeof(float), 1.0f },
        { typeof(decimal), 1m },
    };

    public static T Fn<T>(T inValue) where T : struct
    {
        Comparer<T> comparer = Comparer<T>.Default;
        T zero = default(T);
        if (comparer.Compare(inValue, zero) < 0)
        {
            object one;
            if (!OneValues.TryGetValue(typeof(T), out one))
            {
                // Not sure of the best exception to use here
                throw new ArgumentException
                    ("Unable to find appropriate 'one' value");
            }
            return (T) one;
        }
        else 
        { 
            return inValue;
        }
    }
}
double x = MyClass.Fn(3.5d);
float y = MyClass.Fn(3.5f);
int z = MyClass.Fn(2);