似乎List对象不能存储在C#中的List变量中,甚至不能以这种方式显式转换.
List<string> sl = new List<string>();
List<object> ol;
ol = sl;
Run Code Online (Sandbox Code Playgroud)
结果无法隐式转换System.Collections.Generic.List<string>为System.Collections.Generic.List<object>
然后...
List<string> sl = new List<string>();
List<object> ol;
ol = (List<object>)sl;
Run Code Online (Sandbox Code Playgroud)
结果无法将类型转换System.Collections.Generic.List<string>为System.Collections.Generic.List<object>
当然,您可以通过从字符串列表中提取所有内容并将其一次放回一个来实现,但这是一个相当复杂的解决方案.
假设我有以下课程:
public class FixExpr {
Expr<FixExpr> in;
}
Run Code Online (Sandbox Code Playgroud)
现在我想介绍一个泛型参数,抽象使用Expr:
public class Fix<F> {
F<Fix<F>> in;
}
Run Code Online (Sandbox Code Playgroud)
但Eclipse并不喜欢这样:
F型不是通用的; 它不能用参数<Fix <F >>进行参数化
这是可能的还是我忽略了导致这个特定实例破坏的东西?
一些背景信息:在Haskell中,这是编写泛型函数的常用方法; 我正在尝试将其移植到Java.上例中的类型参数F具有类型* - >*而不是通常的类型*.在Haskell中它看起来像这样:
newtype Fix f = In { out :: f (Fix f) }
Run Code Online (Sandbox Code Playgroud) 类型系统经常受到批评,因为它是限制性的,即限制编程语言并禁止程序员编写有趣的程序.
Chris Smith 声称:
我们确保程序是正确的(在这种类型检查器检查的属性中),但反过来我们必须拒绝一些有趣的程序.
和
此外,还有一个铁定的数学证明,任何利益的类型检查器总是保守的.构建一个不拒绝任何正确程序的类型检查器并不困难; 不可能.
有人可以概述一下这可能是什么样的有趣程序吗?哪里证明类型检查器必须保守?
更一般:类型检查和类型系统的限制是什么?
我正在设计一种语言,我想知道默认情况下使引用类型不可为空是否合理,并使用"?" 可以为空的值和引用类型.这有什么问题吗?你会怎么做:
class Foo {
Bar? b;
Bar b2;
Foo() {
b.DoSomething(); //valid, but will cause exception
b2.DoSomething(); //?
}
}
Run Code Online (Sandbox Code Playgroud) generics ×2
.net ×1
c# ×1
covariance ×1
haskell ×1
java ×1
non-nullable ×1
polymorphism ×1
type-safety ×1
type-systems ×1
typechecking ×1
types ×1