Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的连词类型#_C#_Types_Type Systems - Fatal编程技术网

C# C中的连词类型#

C# C中的连词类型#,c#,types,type-systems,C#,Types,Type Systems,C#中泛型类的一个优点是可以对类型设置约束,因此只接受满足多个约束的类型。例如: public class Foo<T> where T : Bar, IBaz, IFoobar { public Foo (T value) { //initialize } } public class Foo { public Foo (Bar & IBaz & IFoobar value) { //initializ

C#中泛型类的一个优点是可以对类型设置约束,因此只接受满足多个约束的类型。例如:

public class Foo<T> where T : Bar, IBaz, IFoobar {

    public Foo (T value) {
        //initialize
    }

}
public class Foo {

    public Foo (Bar & IBaz & IFoobar value) {
        //initialize (the "&" syntax is just an example)
    }

}
可以将类设置为泛型,但如果只有构造函数使用
,并且类的其他方法不依赖于
T
,那么这可能会相当麻烦。有些问题甚至可能很难用泛型类来解决,例如,需要编写一个comparer
SomeComparer:IComparer
引入大量实际上根本不是泛型的泛型类

我不明白为什么不实现它,因为类型系统可以很容易地检查参数是否满足所有类型约束


在C语言规范中不定义连词类型的参数有哪些?

该功能可能有用,但尚未实现。C#队只有这么多时间,我想这根本就没有成功。有很多事情使得这很困难:假设您有
Foo
Foo
类,每个类都有非泛型和
Foo
构造函数。如果你调用
newfoo(1)
,那是
Foo..ctor
还是
Foo..ctor
?而
Foo..ctor
是否被
newfoo(“”
)引用?如果不引入一些新的语法,并且混淆我所能看到的任何方式,这是不可能完成的,所以最好不要在构造函数上使用泛型

您可以通过在非泛型类上编写泛型方法来解决这个问题,例如

void Main()
{
    Foo foo = Foo.GetInstance(new BarBazAndFoobarImplementer());
}
public sealed class Foo {
    private Foo(Bar value) {
        this.Thing1 = value.BarProperty;
        this.Thing2 = ((IBaz)value).IBazProperty;
        this.Thing3 = ((IFoobar)value).IFoobarProperty;
    }

    public static Foo GetInstance<T>(T value) where T : Bar, IBaz, IFoobar {
        return new Foo(value);
    }
}
void Main()
{
Foo-Foo=Foo.GetInstance(新的BarBazAndFoobarImplementer());
}
公众密封等级Foo{
私人Foo(Bar值){
this.Thing1=value.BarProperty;
this.Thing2=((IBaz)值).IBazProperty;
this.Thing3=((IFoobar)值).IFoobar属性;
}
公共静态Foo GetInstance(T值),其中T:Bar、IBaz、IFoobar{
返回新的Foo(值);
}
}

(这不会遇到上述问题,因为您可以毫不含糊地调用
Foo.GetInstance(..)
Foo.GetInstance(..)

这样做的一种方法是使用私有构造函数和工厂方法:

public class Foo 
{
    public static Foo Create<T>(T value) where T : Bar, IBaz, IFoobar
    {
        return new Foo(value);
    }

    private Foo(Bar value)
    {
        // whatever
        // feel free to cast to IBaz or IFoobar as needed
    }
}
公共类Foo
{
公共静态Foo Create(T值),其中T:Bar、IBaz、IFoobar
{
返回新的Foo(值);
}
私人Foo(Bar值)
{
//随便
//根据需要,您可以随意向IBaz或IFoobar施放
}
}
您不能使用构造函数来实现这一点,因为构造函数应该构造其类型的实例。您将如何处理
?也许可以将其存储在字段中,但字段的类型是什么


更好的方法可能是
Bar
,或者从
Bar
派生的类实现这两个接口。

最有可能的是:C#团队的时间有限,并且认为其他语言改进更重要。然而,我确实认为对代数数据类型(连接、有区别的并集)的支持可能是对C#的一个有价值的补充。顺便说一下,您可以使用静态工厂方法来处理构造函数示例。是的,但是工厂方法引入了更多的类。我并没有说这是一个不好的解决方法,但我想合取类型更优雅。这个问题有点超出StackOverflow的范围。“什么是论据”使它变得主观,很难专断地回答。@vcsjones:我部分同意。虽然有些变通方法可能像Medo42提供的方法一样有价值,但我在这里感到困惑。有人能告诉我为什么要在构造函数中为非泛型的类使用泛型参数吗?我正在努力想一个合理的方案。我正在跳Lippert舞,但灵感暗示着我。比如说,你有一个
条码的集合(你不能修改类型,因为它是继承的),但你还想通知该对象,这是在
IBaz
界面中实现的,然后可以同时执行这两项操作,而不必担心对象可能不支持
IBaz
…@CommuSoft当然,我看到了理论值。我只是不确定它的实用价值是否很高。也许C#团队也有同样的感受,他们决定实施另一项功能。