C# 3.0 关于var类型的问题
我不熟悉C#3.0变量类型。这里我有一个关于这种类型的问题。以库中的以下简单代码为例: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; } } }
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);